Asp.net Web Api重定向请求

我有一个Asp.net Web API项目,它有几种CRUD方法。

在这些方法之上,我想添加一个Authorization服务,该服务读取Authorization标头并阻止用户访问资源(如果他们未经授权)。

 // Method on internal IP Project public class InternalController : ApiController { public void Create(CreateRequest request) { // implement the method } } // Method on public IP Project public class ExternalController : ApiController { public async Task Create(CreateRequest request) { // validate Authorization header and throw exception if not valid using (HttpClient client = new HttpClient()) { string parameters = string.Format("param1={0}&param2={1}", request.Param1, request.Param2); client.BaseAddress = new Uri("http://192.168.1.1/"); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpResponseMessage response = await client.GetAsync("api/internal/create?" + parameters); response.EnsureSuccessStatusCode(); } } } 

有没有办法将外部API的请求“重定向”到内部API更容易?

现在,我必须手动重新创建我在ExternalAPI中收到的所有参数,并将它们发送到InternalAPI,即使它们是相同的。

我可以让HttpClient自动发送我在ExternalAPI方法中的HttpRequestMessage (Request)对象吗?

在谈论ASP.NET Web API时 。 HttpClient不会自动重定向您。 当您成为内部服务的响应时,您可以将其传递给外部服务。 或者您可以像这里一样重定向您的操作

要从REST的角度为客户端正确重定向,请使用HTTP重定向标头和repsonse代码。 例如HTTP响应代码302 。 然后,客户端应该能够对此类响应代码做出反应,并从Location头获取重定向地址。 但它是关于重定向客户端。

在谈论从架构中调用API中的某些内部服务时 。 您有以下替代方案:

  1. 将您的内部服务作为类方法调用
  2. 为服务电话提供服务
  3. 设置消息队列或总线,您的API将通过服务总线与它通信。

将您的内部服务称为类方法非常简单。 服务电话没有影响和延迟。 但你应该参考assembly,但并不总是可行的。 或者由于要求,这种方式是不可能的

为服务呼叫提供服务有缺点:您的服务紧密耦合,您有延迟,应等待内部服务的响应。 这被认为是不好的做法。 但作为服务总线的第一步,这可能是一个很好的临时解决方案。

设置消息队列或总线,您的API将通过服务总线与它通信。 您的服务是分离和独立的。 你不应该等待回应。 但是在技术上更难以设置并使您的架构和基础架构更复杂/

总结从您的架构框中没有最佳方法,您应该根据您的要求从备选方案中进行选择。

以下是将数据发布到web api的示例代码: –

  var handler = new HttpClientHandler {UseDefaultCredentials = true}; using (var client = new HttpClient(handler)) { client.BaseAddress = new Uri("https://IE url.com"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var postDataObject = new { SCName = properties.Site.PortalName, TotalSites = properties.Web.Webs.Count }; var jsonPostData = new JavaScriptSerializer().Serialize(postDataObject); HttpContent content = new StringContent(jsonPostData, System.Text.Encoding.UTF8, "application/json"); HttpResponseMessage response = client.PostAsync("/controllerclassname/InsertUpdateDataOperation", content).Result; if (response.IsSuccessStatusCode) { //Check the response here // var webApiResponse = response.Content.ReadAsStringAsync().Result; }