Asp.net Web Api重定向请求

本文关键字:重定向 请求 Api Web net Asp | 更新日期: 2023-09-27 18:11:40

我有一个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}&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自动发送HttpRequestMessage (Request)对象,我在ExternalAPI方法?

Asp.net Web Api重定向请求

说到ASP。. NET Web API。HttpClient不会自动重定向你。当您成为内部服务的响应时,您可以将其传递给外部服务。或者你可以重定向你的动作,比如这里

从REST的角度使用HTTP重定向头和响应代码使其正确重定向到客户端。例如HTTP响应码302。然后客户端应该能够对这样的响应代码作出反应,并从位置标头获得重定向地址。但这是关于客户端的重定向。

当谈到从架构调用API的一些内部服务时。您有以下选项:

  1. 调用内部服务作为类方法
  2. 业务呼叫
  3. 设置消息队列或总线,API将通过服务总线与之通信。

调用内部服务作为类方法非常容易。对服务电话没有影响和延迟。但你应该参考汇编,这并不总是可能的。或者由于要求,这样的方式是不可能的

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

设置消息队列或总线,您的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;                    
                }