代码之家  ›  专栏  ›  技术社区  ›  Vasyl Senko

将ASP.Net WebAPI请求转发到另一个API

  •  1
  • Vasyl Senko  · 技术社区  · 6 年前

    我正试图将请求从一个API转发到另一个API,如下所示:

    protected Task<HttpResponseMessage> ForwardRequestToSomeApi()
    {
        string forwardUri = "https://some.api" + Request.RequestUri.PathAndQuery;
    
        Request.Headers.Remove("Host");
        Request.RequestUri = new Uri(forwardUri);
        if (Request.Method == HttpMethod.Get)
        {
            Request.Content = null;
        }
    
        return new HttpClient().SendAsync(Request, HttpCompletionOption.ResponseHeadersRead);
    }
    

    但当发送PUT请求时,我得到:

    完整异常信息:

    {"Message":"An error has occurred.","ExceptionMessage":"An error occurred while sending the request.","ExceptionType":"System.Net.Http.HttpRequestException","StackTrace":"
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
       at System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__1`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
       at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
       at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
       at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__6.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n
       at System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__6.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n
       at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n
       at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"The request was aborted: The request was canceled.","ExceptionType":"System.Net.WebException","StackTrace":"
       at System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting)\r\n
       at System.Net.ConnectStream.System.Net.ICloseEx.CloseEx(CloseExState closeState)\r\n
       at System.Net.ConnectStream.Dispose(Boolean disposing)\r\n
       at System.IO.Stream.Close()\r\n
       at System.Net.Http.HttpClientHandler.<>c__DisplayClass109_0.<GetRequestStreamCallback>b__0(Task task)","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"Cannot close stream until all bytes are written.","ExceptionType":"System.IO.IOException","StackTrace":"
       at System.Net.ConnectStream.CloseInternal(Boolean internalCall, Boolean aborting)"}}}
    

    内部异常:

    写着“StackTrace:at 正在中止)

    更新:

    [HttpPut]
    public Task<HttpResponseMessage> Create(string id, Foo model)
    {
       return ForwardRequestToSomeApi();
    }
    

    这里的问题是我在参数中引入了模型,因为模型绑定请求的内容被读取并解析为模型,所以当我将请求转发到另一个API时,我会发送没有内容的请求。修复方法是删除所有参数:

    [HttpPut]
    public Task<HttpResponseMessage> Create()
    {
       return ForwardRequestToSomeApi();
    }
    
    0 回复  |  直到 6 年前