如何在.NET中调用微服务

时间:2015-04-27 05:49:37

标签: c# .net rest asp.net-web-api microservices

我创建了一个非常简单的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来实现吗?

  3. 感谢您的帮助!

4 个答案:

答案 0 :(得分:4)

REST服务没有架构或WSDL类型的函数来定义服务的格式。与传统的Web服务相比,这使它们的重量更轻。

有一种称为WADL或Web应用程序描述语言的东西,但这不是真正的标准,并且没有得到广泛支持。这也很有争议,因为有很多人认为不需要它。

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

另见有关程序员的讨论

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

答案 1 :(得分:2)

我知道这是超级老,但我无法帮助,但为了货币而回答。

有两种方式可以将API合同与其他.net服务进行通信,我发现这些方法特别有用。

  • 发送带有合同的nuget包(描述响应的接口)以及可能的一些调用逻辑来实现api调用的方法
  • 使用swagger来描述你的api(似乎已经成为API描述获胜者,Swashbuckle在.net中使其无缝),然后手动编码你需要在调用者处使用的位或使用codegen < / LI>

我经常这两种情况,swagger对于文档和其他语言兼容性也很好,并且它是关于合同和向后兼容性的正式做法。

答案 2 :(得分:1)

我会使用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

答案 3 :(得分:0)

我通常不会厌烦像RestSharp这样的额外客户端库。我觉得REST的目的是尽可能地接近黄金旧HTTP,否则除了HttpWebRequest / Response之外的其他任何东西都需要。直接使用请求/响应可以提供很好的控制,并鼓励您思考实际发生的事情,而不是像使用传统的WCF或ASMX服务那样抽象一切。

对于我过去构建的微服务,我已将请求和响应对象保存在单独的库中,并且我已将分发的源分发给组织内的其他开发人员,以便让他们站起来在呼叫服务但它可能对外部消费者不实用;再一次,我想在全面的WCF服务上寻求微服务的重点是,就其本质而言,传递的请求/响应是小而简单的。我一开始对这种做法感到有点不舒服;然而,当我开始得到真正响应的网络应用程序使用javascript(通常是jquery)调用微服务时,就像传统的.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/