2017-06-01 72 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

这些重定向便利方法。