我有一个Asp.net Web API项目,它有几种CRUD方法。
除了这些方法之外,我想添加一个授权服务,该服务读取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}¶m2={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)
对象吗?
答案 0 :(得分:4)
谈论ASP.NET Web API时。 HttpClient不会自动重定向您。当您成为内部服务的响应时,您可以将其传递给外部服务。或者,您可以将操作重定向为here
要从REST的角度为客户端正确重定向,请使用HTTP重定向标头和repsonse代码。例如HTTP response code 302。然后,客户端应该能够对此类响应代码做出反应,并从Location头获取重定向地址。但它是关于重定向客户端。
在谈论从架构中调用API的某些内部服务时。您有以下备选方案:
将您的内部服务称为类方法 很容易。服务电话没有影响和延迟。但你应该参考装配,但并不总是可行的。或者由于要求
,这种方式是不可能的为服务电话提供服务 有缺点:您的服务紧密耦合,您有延迟,应等待内部服务的响应。这被认为是不好的做法。但作为服务总线的第一步,这可能是一个很好的临时解决方案。
设置消息队列或总线,您的API将通过服务总线与它通信。 您的服务是分离和独立的。你不应该等待回应。但是在技术上更难以设置并使您的架构和基础架构更加复杂/
总结 从您的架构框中没有最好的方法,您应该根据您的要求从备选方案中进行选择。
答案 1 :(得分:0)
以下是将数据发布到网络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;
}