[英]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}¶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)
對象嗎?
當談到ASP.NET Web API時 。 HttpClient不會自動重定向您。 當您收到內部服務的響應時,可以將其傳遞給外部。 或者,你可以重定向你的動作就像在這里
要從REST角度對客戶端進行正確的重定向,請使用HTTP重定向標頭和響應代碼。 例如HTTP響應代碼302 。 然后,客戶端應該能夠對此類響應代碼做出反應,並從Location標頭獲取重定向地址。 但這是關於客戶端的重定向。
當談到從架構調用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.