2015-04-27 39 views
6

我創建了一個非常簡單的REST微服務,它接收有關電子郵件的信息併發送它。該微服務發送方法看起來是這樣的:如何在.NET中調用微服務

//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來實現嗎?

感謝您的幫助!

+1

首先,僅僅因爲你的服務很小或者做得不多,不會使它成爲微服務。微服務有一個非常明確的含義,他們不需要安寧。 –

回答

0

這個討論中,我通常不與像RestSharp額外的客戶端庫打擾。我覺得REST的目的是儘可能地接近黃金舊的HTTP,否定除HttpWebRequest/Response之外的其他任何需求。直接處理請求/響應可以提供很好的控制,並鼓勵您思考實際發生的情況,而不是像傳統的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); 

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

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

0

我知道這是超級老了,但我不能幫助,但回答貨幣的緣故。

將API合約與其他.net服務進行通信有兩種方法,我發現它們特別有用。

  • 船的NuGet包合同(接口描述的數據),可能有些人稱之爲邏輯methodise您的API調用
  • 使用招搖來描述你的API(似乎已經走到了作爲API描述贏家,Swashbuckle使它在.net中無縫),然後在手機上手動編碼您需要的位或使用codegen

我經常做這兩件事,對你的合同和向後兼容性要正式。