2017-06-01 33 views
1

我有簡單的URL重寫:重定向到與POST方法網址Asp.Net核心

private static void RedirectToAPI(RewriteContext context) 
    { 
     var request = context.HttpContext.Request; 
     if (request.Path.Value.StartsWith("/apiendpoint", StringComparison.OrdinalIgnoreCase)) 
     {   
      var json = JsonConvert.SerializeObject(request.Path.Value 
       .Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries) 
       .Skip(1)); 
      var response = context.HttpContext.Response; 

      response.Headers[HeaderNames.Location] = $"/custom"; 
      response.StatusCode = StatusCodes.Status301MovedPermanently; 
      context.Result = RuleResult.EndResponse; 
      using (var bodyWriter = new StreamWriter(response.Body)) 
      { 
       bodyWriter.Write(json); 
       bodyWriter.Flush(); 
      } 
     } 
    } 

的問題是,當它重定向到/自定義URL,請求GET方法,而這種方法需要POST。

例如,發送GET請求到url /apiendpoint/first/second/third,然後重寫器響應重定向,因此,以下請求必須使用方法POST,但現在是GET。

如何更改url重寫器響應後的請求方法?

+0

您是否嘗試過'request.Method =「POST」'? – Gururaj

+0

@Gururaj是的,沒有什麼變化,仍然是GET請求。 –

+0

request.Method = HttpMethod.Post ;? – Gururaj

回答

-1

這是一個示例代碼

public class ConvertGetToPostHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     // Add your logic here to decide if the request Method needs to be changed 
     // Caution: This works only if you're redirecting internally 
     request.Method = HttpMethod.Post; 
     return await base.SendAsync(request, cancellationToken); 
    } 
} 

您必須將處理程序添加到處理程序管道作爲

config.MessageHandlers.Add(new ConvertGetToPostHandler());

此外,閱讀在這個documentation得到一些洞察到它的目的和用法。

+0

ASP.NET Core中沒有DelegatingHandler。 [中間件](https://docs.microsoft.com/en-us/aspnet/core/migration/http-modules)被用來替代 – Set

+0

對不起。看起來像今天不是我的一天。對不起,浪費你的時間。我還沒有在Core上工作:( – Gururaj

+1

請檢查此參考[將Http處理程序遷移到Core中間件](https://docs.microsoft.com/en-us/aspnet/core/migration/http-modules),如果它幫助 – Gururaj

-1

編輯:啊,剛纔檢查了意見。如果最初的請求是GET,那麼這也不起作用,並且您無法將瀏覽器告知POST。如果沒有返回一個自動執行JavaScript的表單的視圖。

您需要返回308,而不是301

這裏是改變的代碼:

private static void RedirectToAPI(RewriteContext context) 
{ 
    var request = context.HttpContext.Request; 
    if (request.Path.Value.StartsWith("/apiendpoint", StringComparison.OrdinalIgnoreCase)) 
    {   
     var json = JsonConvert.SerializeObject(request.Path.Value 
      .Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries) 
      .Skip(1)); 
     var response = context.HttpContext.Response; 

     response.Headers[HeaderNames.Location] = $"/custom"; 
     response.StatusCode = 308; 
     context.Result = RuleResult.EndResponse; 
     using (var bodyWriter = new StreamWriter(response.Body)) 
     { 
      bodyWriter.Write(json); 
      bodyWriter.Flush(); 
     } 
    } 
} 

308永久重定向,需要在瀏覽器中保存的方法。 https://httpstatuses.com/308

的臨時版本是MVC核心2.0.0-preview1可用307

這些重定向便利方法。