web-dev-qa-db-ja.com

.NETでマイクロサービスを呼び出す方法

電子メールに関する情報を受信して​​送信する非常に単純なRESTマイクロサービスを作成しました。マイクロサービスの送信メソッドは次のようになります。

//EmailController
[HttpPost]
public IHttpActionResult Send(Email email)
{
    // send email via exchange
}

私のアプリケーションでは、次のようにRestSharpを使用して呼び出します。

var client = new RestClient("http://localhost:51467/api/");
var request = new RestRequest("email/send", Method.POST);
request.RequestFormat = DataFormat.Json;
dynamic obj = new ExpandoObject();
obj.FromAddress = from;
obj.ToAddress = to;
obj.Subject = subject;
obj.Body = body;

request.AddBody(obj);
client.Execute(request);

私が持っている質問:

  1. これは電話をかけるための最良の方法ですか?明らかに、後でエラー処理などを追加する必要がありますが、RestSharpを使用して呼び出しを行う方法について詳しく説明しています。

  2. 私のアプリがマイクロサービスが受け取ることを期待しているオブジェクトを知る必要があるのは少し不快だと感じています-確実に知るために使用するような定義/インターフェース/コントラクトはありません。これは一般的にRESTで問題ないと認められていますか、それともアプリが持つ何らかのインターフェースを実装して、マイクロサービスをもう少し定義された方法で呼び出すことができるようにする必要がありますか?それでも可能ですか? RESTで?

助けてくれてありがとう!

8
makeyoupizza

RESTサービスには、サービスの形式を定義するためのスキーマまたはWSDLタイプの関数がありません。これが、従来のWebサービスと比較して軽量化されている理由です。

WADL、またはWebアプリケーション記述言語と呼ばれるものがありますが、これは実際には標準ではなく、広くサポートされていません。それは必要ないと感じる人がたくさんいるので、それはまたかなり物議を醸しています。

http://en.wikipedia.org/wiki/Web_Application_Description_Language

プログラマーに関するこのディスカッションも参照してください

https://softwareengineering.stackexchange.com/a/133693/4368

4

私はこれが超古いことを知っていますが、私は通貨のために答えざるを得ませんでした。

APIコントラクトを他の.netサービスと通信する方法は2つあり、特に便利です。

  • コントラクト(応答を記述するインターフェイス)と、場合によってはAPI呼び出しをメソッド化するための呼び出しロジックを含むnugetパッケージを出荷します
  • 闊歩を使用してAPIを記述し(API記述の勝者として出てきたようです、 Swashbuckle .netでシームレスになります)、呼び出し元で必要なビットを手動でコーディングするか、codegenを使用します

私は両方を頻繁に行います。swaggerはドキュメントやその他の言語の互換性にも適しています。また、契約と下位互換性について正式に行うことをお勧めします。

ASP.NET WebAPIクライアントライブラリを使用します。 .NETまたは他のフレームワークを使用してコーディングされているかどうかに関係なく、任意のREST APIで動作します。

詳細については、こちらをご覧ください: http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

Nugetパッケージ:Microsoft.AspNet.WebApi.Client

1
lahsrah

私は通常、RestSharpのような追加のクライアントライブラリを気にしません。 RESTの目的は、HttpWebRequest/Response以外の必要性をなくし、ゴールドの古いHTTPにできるだけ近づけることだと思います。リクエスト/レスポンスを直接操作すると、優れた制御が可能になります。従来のWCFまたはASMXサービスのようにすべてを抽象化するのではなく、実際に何が起こっているのかを考えることをお勧めします。

過去に構築したマイクロサービスの場合、リクエストオブジェクトとレスポンスオブジェクトを別々のライブラリ内に保持し、組織内の他の開発者にソースを配布して、サービスの呼び出しに足を踏み入れましたが、おそらくそうではありませんでした。外部の消費者にとって実用的である。繰り返しになりますが、フルスケールのWCFサービスよりもマイクロサービスを利用することのポイントは、その性質上、渡される要求/応答が小さくて単純であるということです。また、最初はこの練習に少し不快感を覚えました。ただし、JavaScript(通常はjquery)を使用してマイクロサービスを呼び出す非常に応答性の高いWebアプリを、従来の.NETアプリと同じくらい簡単に入手し始めたとき、内部システムの非常に優れた統合の可能性に気づき始めました。最終的に、イントラネットは、以前は不可能だったビジネスアプリケーションへのアクションとビューを提供していました。

HttpWebRequest webRequest = WebRequest.Create("http://localhost:51467/api/email/send") as HttpWebRequest;
webRequest.Method = "POST";
webRequest.Credentials = CredentialCache.DefaultCredentials; //or account you wish to connect as
webRequest.PreAuthenticate = true;
webRequest.ContentType = "application/json"; // or xml if it's your preference

string jsonData = Newtonsoft.Json.JsonConvert.SerializeObject(requestObject);

using (StreamWriter streamWriter = new StreamWriter(webRequest.GetRequestStream()))
{
    streamWriter.Write(jsonData);
    streamWriter.Flush();
    streamWriter.Close();
}

HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;

if (webResponse.StatusCode != HttpStatusCode.Accepted)
    throw new ApplicationException("Unexpected Response Code. - " + webResponse.StatusCode);

string response;
using (System.IO.StreamReader readResponse = new System.IO.StreamReader(webResponse.GetResponseStream()))
{
    response = readResponse.ReadToEnd();
}

//swap out for regular xml serializer if you've used xml
dynamic responseObject = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(response);

また、もう1つのヒントとして、Web APIを使用している場合は、WebAPIヘルプページとテストクライアントを追加することをお勧めします。 WCFとASMXで取得する自動生成されたwsdlはありませんが、他の開発者向けのマイクロサービスに関する非常に優れたドキュメント(自動生成されたプロキシクラスという私の意見ではさらに良い)と、を実行できるテストハーネスを取得できます。ブラウザからのサービス

https://github.com/wuchang/WebApiTestClienthttps://www.nuget.org/packages/Microsoft.AspNet.WebApi.HelpPage/

0
RadicalCasey