没有数据的WebAPI POST导致应用程序崩溃

时间:2018-07-13 12:41:07

标签: c# asp.net-web-api owin

我有一个简单的OWIN自托管应用程序,其控制器扩展了ApiController。问题是,当我向控制器发送没有数据的POST请求(该方法没有参数)时,它返回:

  

所需长度

然后,应用程序因未处理的ObjectDisposedException而崩溃(下面是完整的堆栈跟踪)。如果POST请求包含数据,则一切正常。

通过使用以下简单方法进行复制,我从等式中删除了所有控制器逻辑:

[HttpPost]
public void MyMethod()
{
    return;
}

因此,我猜这与路由有关吗?但是我的路线仅设置为默认路线:

config.Routes.MapHttpRoute("My Service", "{controller}/{action}/{id}", new { id = RouteParameter.Optional });

为什么我的应用程序会以这种方式运行?

要发送请求,我使用curl

curl --request POST http://localhost/mycontroller/mymethod

堆栈跟踪:

  

未处理的异常:System.ObjectDisposedException:无法访问   处置对象。对象名称:“ System.Net.HttpListenerResponse”。在   System.Net.HttpListenerResponse.set_StatusCode(System.Int32值)   在<59be416de143456b88b9988284f43350>:0中的[0x00016]   Microsoft.Owin.Host.HttpListener.RequestProcessing.OwinHttpListenerResponse.End   ()[0x0001c]在<5086711574984403b242554b11c41440>:0中   Microsoft.Owin.Host.HttpListener.RequestProcessing.OwinHttpListenerContext.End   ()[0x00010]在<5086711574984403b242554b11c41440>:0中   Microsoft.Owin.Host.HttpListener.RequestProcessing.OwinHttpListenerContext.End   (System.Exception ex)[0x0001e]在   <5086711574984403b242554b11c41440>:0在   Microsoft.Owin.Host.HttpListener.OwinHttpListener + d__5.MoveNext   ()在[5086711574984403b242554b11c41440>:0中的[0x001f9]   ---从上一个引发异常的位置开始的堆栈跟踪-   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()   [0x0000c] in:0 at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess   (System.Threading.Tasks.Task任务)[0x0004e]在   :0处   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification   (System.Threading.Tasks.Task任务)在[0x0002e]中   :0处   System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd   (System.Threading.Tasks.Task任务)在[0x0000b]中   :0处   System.Runtime.CompilerServices.TaskAwaiter.GetResult()[0x00000]在   :0处   Microsoft.Owin.Host.HttpListener.OwinHttpListener + d__0.MoveNext   ()[0x00202]在<5086711574984403b242554b11c41440>:0中   ---从上一个引发异常的位置开始的堆栈跟踪-   System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()   [0x0000c] in:0 at   System.Runtime.CompilerServices.AsyncMethodBuilderCore.m__1   (系统对象状态)在[0x00000]中   :0处   System.Threading.QueueUserWorkItemCallback.WaitCallback_Context   (系统对象状态)在[0x0000e]中   :0处   System.Threading.ExecutionContext.RunInternal   (System.Threading.ExecutionContext执行上下文,   System.Threading.ContextCallback回调,System.Object状态,   System.Boolean reserveSyncCtx)[0x0008d]在   :0处   System.Threading.ExecutionContext.Run   (System.Threading.ExecutionContext执行上下文,   System.Threading.ContextCallback回调,System.Object状态,   System.Boolean prepareSyncCtx)[0x00000]在   :0处   System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem   ()[0x0002a] in:0 at   System.Threading.ThreadPoolWorkQueue.Dispatch()[0x00096]在   :0处   System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()   [0x00000] in:0

1 个答案:

答案 0 :(得分:0)

也许如果您显示所有控制器类,我可以帮助您更多。

尝试使您的帖子这样。

每个获取/发布都要上一堂课

例如在Controllers / Api / MyFunction.cs文件夹中

在WebApiConfig.cs

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "API/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

“ MyFunction.cs”中的

public class MyFunction : ApiController
{
    public string Get()
    {
        return "hello";
    }
    public bool Post(string param1)
    {
        return 1;
    }
}