关于ASP.NET Web API:Web API批处理请求在Postman中失败

Web API Batch requests failing in Postman

我最近向我的Web API项目添加了批处理请求支持,并花费了一天的大部分时间尝试调试为什么使用Postman批处理请求失败:Unexpected end of MIME multipart stream. MIME multipart message is not complete.

经过一段时间的搜索,并全面了解了CRLF的问题,我终于使用System.Net.Http编写了一个快速的C#控制台应用程序,类似于此处给出的示例。效果很好!

我的问题是:邮递员在做些什么使我的批处理请求失败?
使用提琴手来捕获请求,然后使用winmerge来区分它们,唯一的区别是邮递员请求包含一些其他标头:

1
2
3
4
5
6
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Cache-Control: no-cache
Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

我尝试将这些标头添加到我的控制台应用程序中以使请求完全相同,但它仍然可以在我的控制台应用程序中使用,但是在Postman中失败了!

有人知道为什么吗?

以下捕获提琴手的请求:

邮递员:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
POST http://localhost:49402/api/sequentialBatch HTTP/1.1
Host: localhost:49402
Connection: keep-alive
Content-Length: 528
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Cache-Control: no-cache
Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
Session-ID: 03317cfa-c051-4813-a02a-a9fa955cc7f5
Authorization: Basic c2E6c2E=
Content-Type: multipart/mixed; boundary="c3581ff4-f6eb-4c41-ac02-0bb8b80b30ef"
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

--c3581ff4-f6eb-4c41-ac02-0bb8b80b30ef
Content-Type: application/http; msgtype=request

GET /api/currency?$filter=Currency_ID eq 'Z-US$' HTTP/1.1
Host: localhost.fiddler:49402
Authorization: Basic c2E6c2E=
Session-ID: 03317cfa-c051-4813-a02a-a9fa955cc7f5

--c3581ff4-f6eb-4c41-ac02-0bb8b80b30ef
Content-Type: application/http; msgtype=request

GET /api/countrycode/US HTTP/1.1
Host: localhost.fiddler:49402
Authorization: Basic c2E6c2E=
Session-ID: 03317cfa-c051-4813-a02a-a9fa955cc7f5


--c3581ff4-f6eb-4c41-ac02-0bb8b80b30ef--

控制台应用程序:(带有其他邮递员标头)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
POST http://localhost:49402/api/sequentialBatch HTTP/1.1
Host: localhost:49402
Connection: Keep-Alive
Content-Length: 553
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Cache-Control: no-cache
Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm
Session-ID: 03317cfa-c051-4813-a02a-a9fa955cc7f5
Authorization: Basic c2E6c2E=
Content-Type: multipart/mixed; boundary="cf2b18a3-5861-49d7-878b-142283cb4959"
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US, en; q=0.8

--cf2b18a3-5861-49d7-878b-142283cb4959
Content-Type: application/http; msgtype=request

GET /api/currency?$filter=Currency_ID%20eq%20'Z-US$' HTTP/1.1
Host: localhost.fiddler:49402
Authorization: Basic c2E6c2E=
Session-ID: 03317cfa-c051-4813-a02a-a9fa955cc7f5


--cf2b18a3-5861-49d7-878b-142283cb4959
Content-Type: application/http; msgtype=request

GET /api/countrycode/US HTTP/1.1
Host: localhost.fiddler:49402
Authorization: Basic c2E6c2E=
Session-ID: 03317cfa-c051-4813-a02a-a9fa955cc7f5


--cf2b18a3-5861-49d7-878b-142283cb4959--

我确实注意到一个区别:在邮递员中,Content-Length标头从553(已发布)更改为528(在捕获时)...不确定是否与我的问题有关...


对此有一些问题,但是我正在使用Fiddler。看来空的返回字符会有所不同:

http://prntscr.com/7eq1w1

这似乎也就是您的Postman请求和控制台应用程序之间的区别。