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

时间:2019-01-17 17:21:56

标签: c# .net asp.net-web-api dotnet-httpclient

我正在尝试将请求从一个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)"}}}

内部异常:

  

IOException消息:“直到所有字节都被保存后才能关闭流   写。” StackTrace:at   System.Net.ConnectStream.CloseInternal(Boolean internalCall,Boolean   流产)

更新:

上面提供的代码可以完全正常工作,问题是我如何尝试使用它。在我的主要API中,我执行了下一个webapi操作:

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

这里的问题是由于模型绑定请求的内容被读取并解析为模型,因此我在参数中引入了模型,因此当我将请求转发到另一个API时,我发送的请求不包含任何内容。解决方法是删除所有参数:

[HttpPut]
public Task<HttpResponseMessage> Create()
{
   return ForwardRequestToSomeApi();
}

0 个答案:

没有答案