如何在 OWIN 管道上的网络 api 2 中接收 multipart/form-data
How can I receive multipart/form-data in web api 2 on OWIN pipeline
我无法让我的 web api 2 方法从 angular [=35] 上的 ng-file-upload 正确读取我的 multipart/form-data post =] 边.
我是这样发起呼叫的:
Upload.upload({
url: config.ApiUrl + 'Orders/CreateOrder',
data: request
}).then(function (response) {
console.log('Success ' + response.config.data.file.name + 'uploaded. Response: ' + response.data);
}, function (error) {
$scope.errors = "Oops! Something went wrong... " + error.statusText;
});
这让我得到了一个有效载荷发送到网络 api:
-----------------------------9623122368016
Content-Disposition: form-data; name="somefield"
Some Value
-----------------------------9623122368016
Content-Disposition: form-data; name="errorMessage"
null
-----------------------------9623122368016
Content-Disposition: form-data; name="success"
false
-----------------------------9623122368016
Content-Disposition: form-data; name="file"; filename="imapdf.pdf"
Content-Type: application/pdf
%PDF-1.2
1 0 obj
<<
/Producer()
/Author()
/Title()
/Subject()
/Keywords()
/CreationDate(D:20040106)
/ModDate(D:20040106)
/Creator()
>>
endobj
2 0 obj
<<
/Type/XObject
/Subtype/Image
/Name/wpt1
/Width 41
/Height 15
/BitsPerComponent 8
/ColorSpace/DeviceRGB
/Length 100
/Filter [/FlateDecode] >>
stream
xsqH0s
我无法访问 HttpContext.Current.Request.Files
,因为我正在使用 OWIN 管道,并且我对 Request.Content.ReadAsMultipartAsync
不太满意
如何在网络中接收我的文件及其关联的表单数据 api2?
C# 代码更新:
public Task<OrderRequest> CreateOrder(OrderRequest orderRequest)
{
try
{
var asdf = OwinHttpRequestMessageExtensions.GetOwinContext(Request);
if (!Request.Content.IsMimeMultipartContent("multipart/form-data"))
{
var provider = new MultipartMemoryStreamProvider();
this.Request.Content.ReadAsMultipartAsync(provider);
var content = provider.Contents.First();
var buffer = content.ReadAsByteArrayAsync();
}
var test = orderRequest;
var a = HttpContext.Current.Request.Files;
}
catch (Exception ex)
{
throw ex;
}
return Task.FromResult<OrderRequest>(null);
}
顾名思义,ReadAsMultipartAsync
是一个异步函数。因为您没有在等待呼叫,所以您很可能会在 Contents
被填充之前尝试访问它。
要解决此问题,您可以按如下方式更新 CreateOrder
操作:
public async Task<OrderRequest> CreateOrder(OrderRequest orderRequest)
{
...
await this.Request.Content.ReadAsMultipartAsync(provider);
...
}
这里唯一的变化就是在Task<OrderRequest>
之前添加了async
,在this.Request.Content.ReadAsMultipartAsync(provider);
之前添加了await
。出于同样的原因,您还需要在 content.ReadAsByteArrayAsync();
之前添加 await
,然后您只需 return null
而不必在末尾使用 Task.FromResult
。
事实上,这里是包含这些更改的完整代码:
public async Task<OrderRequest> CreateOrder(OrderRequest orderRequest)
{
try
{
var asdf = OwinHttpRequestMessageExtensions.GetOwinContext(Request);
if (!Request.Content.IsMimeMultipartContent("multipart/form-data"))
{
var provider = new MultipartMemoryStreamProvider();
await this.Request.Content.ReadAsMultipartAsync(provider);
var content = provider.Contents.First();
var buffer = await content.ReadAsByteArrayAsync();
}
var test = orderRequest;
var a = HttpContext.Current.Request.Files;
}
catch (Exception ex)
{
throw ex;
}
return null;
}
显然,这不是一个完整的解决方案,但我相信它会解决您的具体问题并让您继续探索。
我无法让我的 web api 2 方法从 angular [=35] 上的 ng-file-upload 正确读取我的 multipart/form-data post =] 边.
我是这样发起呼叫的:
Upload.upload({
url: config.ApiUrl + 'Orders/CreateOrder',
data: request
}).then(function (response) {
console.log('Success ' + response.config.data.file.name + 'uploaded. Response: ' + response.data);
}, function (error) {
$scope.errors = "Oops! Something went wrong... " + error.statusText;
});
这让我得到了一个有效载荷发送到网络 api:
-----------------------------9623122368016
Content-Disposition: form-data; name="somefield"
Some Value
-----------------------------9623122368016
Content-Disposition: form-data; name="errorMessage"
null
-----------------------------9623122368016
Content-Disposition: form-data; name="success"
false
-----------------------------9623122368016
Content-Disposition: form-data; name="file"; filename="imapdf.pdf"
Content-Type: application/pdf
%PDF-1.2
1 0 obj
<<
/Producer()
/Author()
/Title()
/Subject()
/Keywords()
/CreationDate(D:20040106)
/ModDate(D:20040106)
/Creator()
>>
endobj
2 0 obj
<<
/Type/XObject
/Subtype/Image
/Name/wpt1
/Width 41
/Height 15
/BitsPerComponent 8
/ColorSpace/DeviceRGB
/Length 100
/Filter [/FlateDecode] >>
stream
xsqH0s
我无法访问 HttpContext.Current.Request.Files
,因为我正在使用 OWIN 管道,并且我对 Request.Content.ReadAsMultipartAsync
如何在网络中接收我的文件及其关联的表单数据 api2?
C# 代码更新:
public Task<OrderRequest> CreateOrder(OrderRequest orderRequest)
{
try
{
var asdf = OwinHttpRequestMessageExtensions.GetOwinContext(Request);
if (!Request.Content.IsMimeMultipartContent("multipart/form-data"))
{
var provider = new MultipartMemoryStreamProvider();
this.Request.Content.ReadAsMultipartAsync(provider);
var content = provider.Contents.First();
var buffer = content.ReadAsByteArrayAsync();
}
var test = orderRequest;
var a = HttpContext.Current.Request.Files;
}
catch (Exception ex)
{
throw ex;
}
return Task.FromResult<OrderRequest>(null);
}
顾名思义,ReadAsMultipartAsync
是一个异步函数。因为您没有在等待呼叫,所以您很可能会在 Contents
被填充之前尝试访问它。
要解决此问题,您可以按如下方式更新 CreateOrder
操作:
public async Task<OrderRequest> CreateOrder(OrderRequest orderRequest)
{
...
await this.Request.Content.ReadAsMultipartAsync(provider);
...
}
这里唯一的变化就是在Task<OrderRequest>
之前添加了async
,在this.Request.Content.ReadAsMultipartAsync(provider);
之前添加了await
。出于同样的原因,您还需要在 content.ReadAsByteArrayAsync();
之前添加 await
,然后您只需 return null
而不必在末尾使用 Task.FromResult
。
事实上,这里是包含这些更改的完整代码:
public async Task<OrderRequest> CreateOrder(OrderRequest orderRequest)
{
try
{
var asdf = OwinHttpRequestMessageExtensions.GetOwinContext(Request);
if (!Request.Content.IsMimeMultipartContent("multipart/form-data"))
{
var provider = new MultipartMemoryStreamProvider();
await this.Request.Content.ReadAsMultipartAsync(provider);
var content = provider.Contents.First();
var buffer = await content.ReadAsByteArrayAsync();
}
var test = orderRequest;
var a = HttpContext.Current.Request.Files;
}
catch (Exception ex)
{
throw ex;
}
return null;
}
显然,这不是一个完整的解决方案,但我相信它会解决您的具体问题并让您继续探索。