如何在 .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. 我发现我的应用程序需要知道微服务期望接收什么对象,这让我感到有点不舒服——它没有使用任何类型的 definition/interface/contract 来确定.这对于 REST 来说是普遍接受的吗,还是我应该实现我的应用程序具有的某种接口,以便它可以以更明确的方式调用我的微服务。这甚至可以用 REST 实现吗?

感谢您的帮助!

REST 服务没有模式或 WSDL 类型的函数来定义服务的格式。这就是使它们比传统 Web 服务更轻量级的原因。

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

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

另请参阅有关程序员的讨论

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

我通常不会为额外的客户端库(如 RestSharp)而烦恼。我觉得 REST 的目的是尽可能接近黄金旧 HTTP,不需要 HttpWebRequest/Response 以外的任何东西。直接使用 request/responses 可以提供很好的控制,并鼓励您思考实际发生的事情,而不是像使用传统 WCF 或 ASMX 服务那样抽象所有内容。

对于我过去构建的微服务,我将请求和响应对象保存在单独的库中,并将源代码分发给我组织内的其他开发人员,让他们在调用服务时有帮助但对于外部消费者来说可能不切实际;我再次猜测在全面的 WCF 服务上寻求微服务的意义在于,就其本质而言,传递的 request/responses 既小又简单。一开始我也对这种做法感到有点不舒服;然而,当我开始使用 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);

另外一个提示,如果您使用网络 api,我真的建议您添加网络 api 帮助页面和测试客户端。您不会拥有通过 WCF 和 ASMX 获得的自动生成的 wsdl,但是您可以为其他开发人员获得一些关于您的微服务的非常好的文档(我认为自动生成的代理 类 更好)和一个测试工具让我们从您的浏览器中使用该服务

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

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

我知道这太老了,但为了钱还是忍不住回答了

有两种方法可以将 API 合同与我认为特别有用的其他 .net 服务进行通信。

  • 发送带有合同的 nuget 包(描述响应的接口)和可能的一些调用逻辑来方法化您的 api 调用
  • 使用 swagger 来描述您的 api(似乎已经成为 API 描述的赢家,Swashbuckle 使其在 .net 中无缝)然后手动编码位您需要调用者或使用代码生成器

我经常两者都做,swagger 对于文档和其他语言的兼容性也很好,而且它是正式的合同和向后兼容性的好习惯。