2016-05-12 9 views
1

GetData(value)を含むService1.svcのWCFサービスがあるとします。WCFと下位互換性のあるWeb APIを変換する

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    string GetData(int value); 
} 

public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

私もすでにこのサービスは、このような何かを消費するために、プロキシ自動生成するクライアントがあります。今

using (var client = new ServiceReference1.Service1Client()) 
{ 
    var result = client.GetData(1); 
    //Assert.AreEqual("You entered: 1", result); 
} 

を、私はそのWCFサービスを削除し、新しいWeb APIに置き換えサービス、このような何か:

[RoutePrefix("Service1.svc")] 
public class DataController : ApiController 
{ 
    [HttpGet] 
    [Route("GetData")] 
    public string GetDataOld(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

私はクライアントService1Client()を使用しようとするので、それはもう動作しません。私はこれが可能だと確信していますが、私はこの目標を達成するために何をしなければなりませんか?

アップデート2016年5月23日

これは不可能ですので、私はクライアント(s)は簡単に新しいRESTfulなWeb APIを実装することができるようにプロキシを作成することを決めました。

+3

すべては使用されているバインディングによって異なります。それがWebHttpBindingの場合、トランスポートはRESTでした。そうでない場合は、クライアントを再実装するか、翻訳プロキシを導入する必要があります。これは簡単なことではありません。 – CodeCaster

答えて

-1

WebApiは、RESTエンドポイントになるように設計されているので、var client = new ServiceReference1.Service1Client()のwcf方法はコンセプトに反します。

URLを使用してアクセスしてください。たとえば、~\Service1.svc\GetData\1のようになります。また、routeの設定を確認してください。

-1

ServiceReference1.Service1Client()はWCFと直接関連しています。 WebApiエンドポイントと対話するためにそれを再利用することはできません。

WebApiエンドポイントと対話するクライアントが必要な場合は、自分でラッパークライアントを作成する必要があります。 RestSharpは私のこのようなことのためのライブラリです。例:

var client = new RestClient("http://localhost:8000"); 
int value = 12345; 

var request = new RestRequest($"Service1.svc/GetData/{value}", Method.GET); 
IRestResponse response = client.Execute(request); 
var content = response.Content; // returns "You entered: 12345" 

(未テスト)

0

これは可能であり、我々は現在、同じような何かをやっている - 私たちは、クライアントのプロキシを変更せずに、WebAPIの/ JSONエンドポイントとのWCF/SOAPサービスのエンドポイントを置き換えます。これを行うには

は、あなたがWebHttpBindingを使用し、プロキシが右の呼び出しを生成するように、あなたのサービス・インターフェースにいくつかのより多くの属性を追加する必要があります。

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    [WebGet] 
    string GetData(int value); 

    [OperationContract] 
    [WebInvoke(Method="POST", RequestFormat = WebMessageFormat.Json)] 
    void PostData(MyDataType data); 
} 

これは、プロキシの使用HTTP呼び出しを行う、というよりますあなたのサービスにアクセスするためのSOAP呼び出し。ご覧のように、これはGETリクエストとPOSTリクエストの両方で機能し、データをJSON(または必要に応じてXML)として自動的にシリアル化します。

customizeへのより多くの方法があること - より複雑なHTTPルートを指定する(または二つの方法、GetDataPostDataを持って、同じルートに両方のマップを動詞だけで、RESTfulな方法は異なる)するUriTemplateプロパティを使用してのように。また、警告もあります。私が見ることのできるところから、の文字列をintでなくGETリクエストに渡すことしかできません。しかし、すべてで、それは非常にうまく動作します。

WebAPI/RESTでプロジェクトを開始した場合、WebAPIエンドポイントにマッピングされたWCFプロキシを使用することにしましたか?おそらくそうではありません。しかしこれにより、フロントエンドコードの変更が比較的少ないバックエンドを切り替えることができました。