簡體   English   中英

如何在.NET中調用微服務

[英]How to call a microservice in .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做點什么?

謝謝你的幫助!

REST服務沒有架構或WSDL類型的函數來定義服務的格式。 與傳統的Web服務相比,這使它們的重量更輕。

有一種稱為WADL或Web應用程序描述語言的東西,但這不是真正的標准,並且沒有得到廣泛支持。 這也很有爭議,因為有很多人認為不需要它。

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

另請參閱有關程序員的討論

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

我知道這是超級老,但我無法幫助,但為了貨幣的回答。

有兩種方法可以將API合同與其他.net服務進行通信,我發現這些方法特別有用。

  • 發送帶有契約的nuget包(描述響應的接口)以及可能的一些調用邏輯來定義你的api調用
  • 使用swagger來描述你的api(似乎已經成為API描述的贏家, Swashbuckle在.net中使其無縫),然后手動編碼你需要的位置給調用者或使用codegen

我經常這兩個,swagger也很適合文檔和其他語言兼容性,並且它的正確做法是正式的合同和向后兼容性。

我會使用ASP.NET Web API客戶端庫。 它適用於任何REST API,無論是使用.NET還是其他框架編寫的。

在這里查看詳細信息: http//www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client

Nuget包: Microsoft.AspNet.WebApi.Client

我通常不會厭煩像RestSharp這樣的額外客戶端庫。 我覺得REST的目的是盡可能地接近黃金舊HTTP,否則除了HttpWebRequest / Response之外的其他任何東西都需要。 直接使用請求/響應可以提供很好的控制,並鼓勵您思考實際發生的事情,而不是像傳統的WCF或ASMX服務那樣抽象一切。

對於我過去構建的微服務,我已經將請求和響應對象保存在單獨的庫中,並且我已將源代碼分發給組織內的其他開發人員,以便他們在調用服務方面有所幫助,但它可能不會對外部消費者來說是實用的; 再一次,我想在全面的WCF服務上尋求微服務的重點是,就其本質而言,傳遞的請求/響應是小而簡單的。 我一開始對這種做法感到有點不舒服; 然而,當我開始得到真正響應的網絡應用程序使用javascript(通常是jquery)調用微服務時,就像傳統的.NET應用程序一樣容易,我開始看到我們內部系統的一些非常好的集成的潛力。 最終,我們的Intranet正在為業務應用程序提供以前無法實現的操作和視圖。

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);

另外一個提示,如果您正在使用web api,我真的建議添加web api幫助頁面和測試客戶端。 你不會使用WCF和ASMX自動生成的wsdl,但是你可以為其他開發人員獲得一些關於你的微服務的非常好的文檔(我認為自動生成的代理類更好)和一個可以運行的測試工具。從您的瀏覽器服務

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM