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

Posted

技术标签:

【中文标题】没有数据的 WebAPI POST 导致应用程序崩溃【英文标题】:WebAPI POST without data causes application to crash 【发布时间】:2018-12-21 20:21:53 【问题描述】:

我有一个简单的 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 值) [0x00016] 在 :0 中 Microsoft.Owin.Host.HttpListener.RequestProcessing.OwinHttpListenerResponse.End () [0x0001c] 在 :0 处 Microsoft.Owin.Host.HttpListener.RequestProcessing.OwinHttpListenerContext.End () [0x00010] 在 :0 处 Microsoft.Owin.Host.HttpListener.RequestProcessing.OwinHttpListenerContext.End (System.Exception ex) [0x0001e] in :0 在 Microsoft.Owin.Host.HttpListener.OwinHttpListener+d__5.MoveNext () [0x001f9] 在 :0 --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] 在 :0 处 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task 任务) [0x0004e] in :0 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task 任务) [0x0002e] in :0 在 System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task 任务) [0x0000b] in :0 在 System.Runtime.CompilerServices.TaskAwaiter.GetResult () [0x00000] 在 :0 在 Microsoft.Owin.Host.HttpListener.OwinHttpListener+d__0.MoveNext () [0x00202] 在 :0 --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] 在 :0 处 System.Runtime.CompilerServices.AsyncMethodBuilderCore.m__1 (System.Object 状态)[0x00000] 在 :0 在 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context (System.Object 状态) [0x0000e] in :0 在 System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调,System.Object 状态, System.Boolean preserveSyncCtx) [0x0008d] in :0 在 System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调,System.Object 状态, System.Boolean preserveSyncCtx) [0x00000] 在 :0 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x0002a] 在 :0 处 System.Threading.ThreadPoolWorkQueue.Dispatch() [0x00096] in :0 在 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() [0x00000] 在 :0

【问题讨论】:

【参考方案1】:

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

试着把你的帖子写成这样。

每次获取/发布一个类

例如在文件夹 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;
    

【讨论】:

以上是关于没有数据的 WebAPI POST 导致应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

10-多写一个@Autowired导致程序崩了

Webapi POST 导致 MVC 控制器中的 object

一些简单的Post方式WebApi接收参数和传递参数的方法及总结

系统使用(Python2不支持的) Unicode UTF-8 字符导致 ArcGIS 运行崩毁

WebAPI的AuthorizeAttribute扩展类中获取POST提交的数据

WebApi_返回Post格式数据