2017-12-29 44 views
3

私はビジネスレイヤーとしてAsp.NET WebApiを持っています。私はそれを単にビジネスコントローラを呼び出すことによってメソッドと呼んでいます。このような 何か:(しかし、私は、サービス参照のように、このWEBAPIを追加することはできませんよ)WebAPIをASMX Webサービスのようなインスタンスを作成して使用する方法

Business.API.UserController Users = new Business.API.UserController(); 
Users.GetAllUser(); 

以前に私はちょうど追加することで、Webサービスのインスタンスを作成することができましたWCF Webサービスで働いていましたそれは「サービス参照の追加」といくつかのエンドポイントの設定を通してです。 私はWebAPIでそれを行うことはできません(私は思う)。私はそれについて多くの記事を読んだことがありますが、そのほとんどはHttpRequestのメソッドと呼ばれていました。このように :

using (var client = new HttpClient())  
{  
    client.BaseAddress = new Uri("http://localhost:38104/"); 
    client.DefaultRequestHeaders.Accept.Clear();  
    HttpResponseMessage response;  
    response = await client.GetAsync("api/Weather");  
    if (response.IsSuccessStatusCode)  
    {  
     WeatherClient[] reports = await response.Content.ReadAsAsync<WeatherClient[]>();     
    }  
}  

は、私はそれは、Webサービスの使用してとんでもないことだと思います。 私は間違っているか、私に何か問題がありますか?

+0

swagger(WebサービスのAPI記述を生成するもの)を使用して、そのAPI記述からクライアントを生成できるツールを使用できます。 – Evk

+0

あなたのコードで見られる主な問題は、リクエストごとに新しい 'HttpClient'を作成することです。これは共有オブジェクトであるため、サーバー接続を使い果たしません。 – Crowcoder

答えて

6

あなたに間違いはありませんが、それはウェブサービスを使用するばかばかしい方法ではありません。実際には;そののみウェブサービスを使用する方法; WCFはそのコードを隠しました。

免責事項:WCFのようなクラスとしてそれを非表示になります他の.NETクラスとHTTP要求を実行し、シンプルなAPIを有することができるライブラリが、何も

WCFサービスは、自分自身についてのメタデータを公開がありますこれが「サービス参照」が機能する理由です。 Web APIには同様の概念がないため、HTTPリクエストを手動で行う必要があります。もちろん、コードをいくつかの汎用関数にラップして再利用することができます。

右のヘルパーメソッドを使用すると、名前の代わりに各メソッドのエンドポイントを渡すだけで、「RPC」インターフェイスに近づくことができます。

+0

ありがとうございます。このアプローチの主な問題は、ストリーミング出力とインプットに直面していたことでした。 HttpRequestsを使用してストリームを渡す方法とストリームを取得する方法を知りたいと思っていました。だから私は考えているファンダメンタルズを読む必要があります。 – RezaNoei

+0

@RezaNoei少なくとも1つの.NET HttpクラスにストリームAPIがあります。通常、彼らはそれに対処するような痛みですが、好まれていません。 – BradleyDotNET

+0

そのように明確に定義された方法はないようです。 もう一度ありがとうございます。 – RezaNoei

2

HttpClientを直接インスタンス化するのではなく、クラスがインターフェイスに依存するのが最適です。私はWCFサービスでこれを正しく行ったアプリケーションを見たことがあります。サービスインターフェイスによっては、Web APIにとっては抽象化を捨ててHTTPリクエストを直接組み込むことになります。

アプリケーション内では、Web API、モックその他の何かの実装が抽象化されるように、サービスを表すインターフェイスを定義することができます。例えば

、あなたはこのインタフェース

public interface IFooService 
{ 
    FooDto GetFoo(Guid id); 
    List<FooDto> GetAllFoos(); 
    Guid InsertFoo(FooInsertDto foo); 
    void UpdateFoo(FooDto updating); 
    void DeleteFoo(Guid id); 
} 

に依存し、この実装を使用する場合があります。

public class FooServiceClient : IFooService 
{ 
    private readonly RestClient _restClient; 

    public FooServiceClient(string baseUrl) 
    { 
     _restClient = new RestClient(baseUrl.TrimEnd('/')); 
    } 

    public FooDto GetFoo(Guid id) 
    { 
     var request = new RestRequest($"api/foo/get{id}", Method.GET); 
     var foo = _restClient.Execute<FooDto>(request).Data; 
     return foo; 
    } 

    public List<FooDto> GetAllFoos() 
    { 
     var request = new RestRequest("api/foo/getall", Method.GET); 
     var foos = _restClient.Execute<List<FooDto>>(request).Data; 
     return foos; 
    } 

    public Guid InsertFoo(FooInsertDto foo) 
    { 
     var request = new RestRequest("api/foo/insert", Method.POST) 
      { RequestFormat = DataFormat.Json}; 
     request.AddBody(foo); 
     return _restClient.Execute<Guid>(request).Data; 
    } 

    public void UpdateFoo(FooDto updating) 
    { 
     var request = new RestRequest("api/foo/update", Method.POST) 
     { RequestFormat = DataFormat.Json }; 
     request.AddBody(updating); 
     _restClient.Execute(request); 
    } 

    public void DeleteFoo(Guid id) 
    { 
     var request = new RestRequest("api/foo/delete", Method.POST) 
     { RequestFormat = DataFormat.Json }; 
     request.AddBody(id); 
     _restClient.Execute(request); 
    } 
} 

これもRestSharpの使用方法を示します。使用するたびにHttpClientを作成して処分することはお勧めしません。 RestSharpはそれを管理し、要求の送信と応答の読み取りを簡素化する方法を提供します。

+0

ありがとうございます。私はこの知識を所有する長い旅をしています。 – RezaNoei

関連する問題