簡體   English   中英

Asp.net Web Api重定向請求

[英]Asp.net Web Api Redirect request

我有一個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自動發送我在ExternalAPI方法中擁有的HttpRequestMessage (Request)對象嗎?

當談到ASP.NET Web API時 HttpClient不會自動重定向您。 當您收到內部服務的響應時,可以將其傳遞給外部。 或者,你可以重定向你的動作就像在這里

要從REST角度對客戶端進行正確的重定向,請使用HTTP重定向標頭和響應代碼。 例如HTTP響應代碼302 然后,客戶端應該能夠對此類響應代碼做出反應,並從Location標頭獲取重定向地址。 但這是關於客戶端的重定向。

當談到從架構調用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;                    
                }   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM