Asp.net Web API 2批处理请求路由正确,但没有数据或错误

Asp.net Web API 2批处理请求路由正确,但没有数据或错误,asp.net,rest,iis,asp.net-web-api,asp.net-web-api2,Asp.net,Rest,Iis,Asp.net Web Api,Asp.net Web Api2,我最近创建了一个新的WebAPI2项目,并且正在为我的RESTfulAPI使用大多数默认的脚手架。我正在尝试添加批处理支持,并一直使用这两种资源作为指导: 我添加了路由,并使用框架提供的DefaultHttpBatchHandler,因此我的WebApiConfig.cs如下所示: using System.Web.Http; using Microsoft.Owin.Security.OAuth; using System.Web.Http.Batch; namespace WebAPI

我最近创建了一个新的WebAPI2项目,并且正在为我的RESTfulAPI使用大多数默认的脚手架。我正在尝试添加批处理支持,并一直使用这两种资源作为指导:

我添加了路由,并使用框架提供的
DefaultHttpBatchHandler
,因此我的
WebApiConfig.cs
如下所示:

using System.Web.Http;
using Microsoft.Owin.Security.OAuth;
using System.Web.Http.Batch;

namespace WebAPI_Test
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpBatchRoute(
            routeName: "batch",
            routeTemplate: "api/$batch",
            batchHandler: new DefaultHttpBatchHandler(GlobalConfiguration.DefaultServer)
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        }
    }
}
我还有以下控制器:

using System;
using System.Web.Http;

namespace WebAPI_Test.Controllers
{
    public class CustomersController : ApiController
    {
        public string Get(string id)
        {
        string val = String.Format("Customer: {0}", id);

        return val;
        }

    }
}
我可以通过Fiddler4发出以下HTTP请求并获得成功响应:

GET http://example.com:8010/WebAPI_Test/api/customers/abs HTTP/1.1
User-Agent: Fiddler
Host: example.com:8010
我还可以成功地命中批处理端点并获得200响应,但是,当我命中时,我不会得到任何数据,并且我的控制器上的断点也不会被命中。使用以下请求:

POST http://example.com:8010/WebAPI_Test/api/$batch HTTP/1.1
User-Agent: Fiddler
Content-Type: multipart/mixed; boundary=abc101
Host: example.com:8010
Accept: multipart/mixed
Accept-Charset: UTF-8
Content-Length: 179


--abc101
Content-Type: application/http; msgtype=request
GET http://example.com:8010/WebAPI_Test/api/Customers/abc HTTP/1.1
Host: example.com:8010
--abc101--
我得到:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 84
Content-Type: multipart/mixed; boundary="1c950245-84e8-4c1b-8545-58e93cdd7b25"
Expires: -1
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 18 Feb 2016 00:09:54 GMT

--1c950245-84e8-4c1b-8545-58e93cdd7b25

--1c950245-84e8-4c1b-8545-58e93cdd7b25--
我注意到在我上面提到的两个链接中,后续请求都使用相对路径。因此,我将我的请求主体修改为:

--abc101
Content-Type: application/http; msgtype=request
GET /WebAPI_Test/api/Customers/abc HTTP/1.1
Host: example.com:8010
--abc101--
但是,现在我只收到一个通用的
500:internalserver Error
响应,没有一个断点被命中。我猜想这个错误是从一个.NET库抛出的,但我没有得到堆栈跟踪

在上面的第一个链接中,作者使用Owin和自托管。我注意到他在他的
app
对象上调用了
UseWebApi
方法。虽然我是通过IIS托管的,但我还是决定尝试一下(无可否认,这里的想法已经没有了)。在我的
StartUp.cs
文件中,我有以下内容:

using Microsoft.Owin;
using Owin;
using System.Web.Http;

[assembly: OwinStartup(typeof(WebAPI_Test.Startup))]

namespace WebAPI_Test
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
        ConfigureAuth(app);
        app.UseWebApi(GlobalConfiguration.DefaultServer);
        }
    }
}
{
  "Message": "An error has occurred.",
  "ExceptionMessage":"Error parsing HTTP message header byte 5 of message System.Byte[].",
  "ExceptionType":"System.InvalidOperationException","StackTrace":"   at System.Net.Http.HttpContentMessageExtensions.<ReadAsHttpRequestMessageAsyncCore>d__0.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.Batch.DefaultHttpBatchHandler.<ParseBatchRequestsAsync>d__13.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.Batch.DefaultHttpBatchHandler.<ProcessBatchAsync>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.Batch.HttpBatchHandler.<SendAsync>d__0.MoveNext()"
}
使用上面提到的第一批HTTP请求(请求体中有完整路径),我得到了相同的结果:200但没有数据,并且控制器方法从未命中

当我尝试仅使用请求正文中的相对路径时,仍然会得到一个500错误,但不是一般的“发生错误”消息,而是得到以下消息:

using Microsoft.Owin;
using Owin;
using System.Web.Http;

[assembly: OwinStartup(typeof(WebAPI_Test.Startup))]

namespace WebAPI_Test
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
        ConfigureAuth(app);
        app.UseWebApi(GlobalConfiguration.DefaultServer);
        }
    }
}
{
  "Message": "An error has occurred.",
  "ExceptionMessage":"Error parsing HTTP message header byte 5 of message System.Byte[].",
  "ExceptionType":"System.InvalidOperationException","StackTrace":"   at System.Net.Http.HttpContentMessageExtensions.<ReadAsHttpRequestMessageAsyncCore>d__0.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.Batch.DefaultHttpBatchHandler.<ParseBatchRequestsAsync>d__13.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.Batch.DefaultHttpBatchHandler.<ProcessBatchAsync>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.Batch.HttpBatchHandler.<SendAsync>d__0.MoveNext()"
}
{
“消息”:“发生错误。”,
“ExceptionMessage”:“解析消息系统的HTTP消息头字节5时出错。字节[]。”,
“ExceptionType”:“System.InvalidOperationException”,“StackTrace”:“at System.Net.Http.HttpContentMessageExtensions.d_u0.MoveNext()\r\n--从引发异常的上一个位置开始的堆栈结束跟踪----\r\n在System.Runtime.CompilerServices.TaskWaiter.ThrowForOnSuccess(任务任务)\r\n在System.Web.Http.Batch.DefaultHttpBatchHandler.d\u 13.MoveNext()\r\n---从引发异常的上一个位置开始的堆栈结束跟踪---\r\n在System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)处\r\n在System.Web.Http.Batch.DefaultHttpBatchHandler.d\u 1.MoveNext()\r\n--从引发异常的上一个位置开始的堆栈结束跟踪---\r\n在System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务任务)处\r\n位于System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n位于System.Web.Http.Batch.HttpBatchHandler.d\u 0.MoveNext()
}
我试图修改Customers controller get方法以异步运行(即返回一个
任务
,尽管我所做的只是返回一个字符串,我知道这是多么毫无意义),但我仍然收到相同的错误消息


我希望我错过了一些显而易见的痛苦。我找不到任何论坛/问题/资源来解决这个问题。如果任何人有任何见解或帮助,将不胜感激。如果需要,我可以发布更多的配置代码(尽管这是相当标准的脚手架)。提前谢谢

这已通过IIS更新得到修复


我应该在一段时间前更新它,以防其他人看到它;如果还有其他人在使用Windows Server 2008/Windows 2007,则通过对IIS的更新最终解决了这一问题。我希望我能报告问题最初是什么,但一旦它起作用,就不需要进一步调查了(至少从我当时的雇主的角度来看是这样)。

您是否检查了Fiddler中的Inspectors选项卡->Response sub tab-->JSON菜单(或原始菜单)以获取响应数据?是的,上述错误来自响应的原始菜单。对不起,如果不清楚的话。在我调用UseWebApi方法之前,原始响应实际上是“发生了一个错误”,上面带有堆栈跟踪的消息是在我在app对象上调用它之后出现的。我最初有一个用于基本身份验证的HttpModule。尝试单步执行时,它会从context.OnAuthenticateRequest调用跳到contect.OnEndRequest,我会收到这些错误消息。我不知道如何进一步调试此代码(无法进入.net代码)或我可能做错了什么:/谢谢您的回复。抱歉,我很忙,无法检查此代码。今天早上,我创建了您在本文中提到的解决方案,我能够从小提琴手那里得到响应。这就是我所做的。1.创建了一个WebApi2解决方案,并添加了一个名为“BatchApi_Test”的控制器,该控制器与您提到的“Get”方法相同。2.更新webapi.config.cs以包含批处理支持3。在Fiddler中编写Get请求。确切的要求是,今天早上我创建了您提到的解决方案,我能够得到响应。这就是我所做的。1.创建了一个WebApi2解决方案,并添加了一个名为“BatchApi_Test”的控制器,该控制器与您提到的“Get”方法相同。2.从Visual Studio 3更新webapi.config.cs以包含批处理支持和点击启动调试。在Fiddler中编写Get请求。确切的要求是,4。点击执行。5.双击左侧的请求,发现Json响应为Json=Customer:abs22I也能够调试。。。我会很快检查$batch,然后再给您回复。请注意,主机名应该与您的主机名相匹配(如果您正在机器中调试,请说localhost),我不认为它是c