Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 大小超过64KB的请求无法完成(Asp.Net核心Web API)_C#_Rest_Image Uploading_Asp.net Core Webapi_.net 4.6.1 - Fatal编程技术网

C# 大小超过64KB的请求无法完成(Asp.Net核心Web API)

C# 大小超过64KB的请求无法完成(Asp.Net核心Web API),c#,rest,image-uploading,asp.net-core-webapi,.net-4.6.1,C#,Rest,Image Uploading,Asp.net Core Webapi,.net 4.6.1,我正在Visual Studio 2017(15.6.5)中使用Asp.Net Core 2.0 web API技术(完整的.Net Framework 4.6.1)开发REST web服务 我的问题 每当我发送一个超过64KB的post请求时,它就会挂起并且永远不会完成。例如,大小为68'259字节的post请求失败,而大小为63'534字节的post请求完成时没有任何问题 当我尝试上载图像(使用MultipartFormDataContent)时,问题首次出现,但请求的内容并不重要。我还尝试

我正在Visual Studio 2017(15.6.5)中使用Asp.Net Core 2.0 web API技术(完整的.Net Framework 4.6.1)开发REST web服务

我的问题 每当我发送一个超过64KB的post请求时,它就会挂起并且永远不会完成。例如,大小为68'259字节的post请求失败,而大小为63'534字节的post请求完成时没有任何问题

当我尝试上载图像(使用
MultipartFormDataContent
)时,问题首次出现,但请求的内容并不重要。我还尝试将图像作为字节数组和另一个对象实例中属性内转换的Base64字符串发送

到底发生了什么 使用Fiddler捕获流量时,请求永远不会完成。它从未收到回应

控制器方法甚至从未被调用,因为其中没有断点被命中。然而,我们的自定义中间件的Invoke方法正在被调用,尽管它从未运行过
这一行,请等待它。_next.Invoke(context)

公共类版本中间件
{
private readonly RequestDelegate\u next;
公共版本化中间件(RequestDelegate next)
{
这个。_next=next;
}
公共异步任务调用(HttpContext上下文)
{
...
等待此消息。\u next.Invoke(上下文);
}
...
}
进一步资料 我用来上传图片

当我试图弄明白为什么Web服务从不返回响应时(没有结果),我下载了示例解决方案,看看这个解决方案是否有效。虽然它使用了.Net标准,而不是完整的.Net框架,但确实如此,因此我在该解决方案中使用完整的.Net框架创建了一个新的webservice项目,复制了整个控制器,并将目标平台更改为x86,以使配置与我的实际web服务相匹配(我们仍然需要查询MS Access数据库,这就是为什么我一直使用32位应用程序的原因)。 这个示例web服务的新版本对于上传大于64KB的图像也很有吸引力

这对我来说没有多大意义,因为我看不到任何显著的差异

发送请求的应用程序代码(为了清晰起见,在某些部分缩写):

public async Task UploadImageAsync(字节[]图像数据、字符串文件名、对象对象参数、取消令牌取消令牌、参数字符串[]路径组件)
{
...
使用(MemoryStream stream=新的MemoryStream(imageData))
{
使用(HttpContent fileStreamContent=newstreamcontent(流))
{
fileStreamContent.Headers.ContentDisposition=newcontentDispositionHeaderValue(“表单数据”){Name=“file”,FileName=FileName};
fileStreamContent.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/八位字节流”);
使用(MultipartFormDataContent formData=new MultipartFormDataContent())
{
添加(fileStreamContent);
string apiPath=string.Join(Globals.PathSeparator,pathComponents);
if(objectParameter!=null)
{
apiPath=apiPath+“?”+objectParameter.ToQueryString();
}
等待此消息。SendPostAsync(apiPath、formData、cancellationToken)。ConfigureAwait(false))
}
}
}
} 
私有任务SendPostAsync(字符串路径、HttpContent内容、CancellationToken CancellationToken)
{
返回此.SendRequestAsync(HttpAction.Post、路径、内容、cancellationToken);
} 
专用异步任务SendRequestAsync(HttpAction操作、字符串路径、HttpContent内容、CancellationToken CancellationToken)
{
...
开关(动作)
{
...
案例HttpAction.Post:
response=wait this.\u client.PostAsync(路径、内容、取消令牌)。configurewait(false);
打破
...
}
...
返回响应;
}
Web服务控制器代码(也缩写):

[路由(“api/[控制器]”)]
公共类文档控制器:ControllerBase
{ 
私人只读IDocuments存储文档;
...
公共文档控制器(IDocuments存储文档,…)
{
本文件=文件;
...
}
...
[HttpPost(名称(保存图像))]
[授权(JwtBearerDefaults.AuthenticationScheme)]
公共IActionResult SaveImage(IFormFile文件,[FromQuery]ServiceReportIdentification documentInfo)
{
此.u documents.SaveImage(文件,documentInfo);
返回这个.createDataAction(nameof(SaveImage),文件);
}
...
}
请求大小限制 默认的IIS请求大小限制应为4MB,并且我尝试上载的大多数图像小于1MB,因此这不应该成为问题。但是,我仍然尝试手动设置所有可以找到的大小限制,看看是否可以覆盖隐藏的64 KB大小限制。没有骰子

我甚至从示例解决方案的.vs\config\applicationhost.config文件中复制了
httpCompression
标记,这是该标记与实际web服务解决方案中的标记之间唯一的真正区别


一些背景 当我创建web服务解决方案时,Asp.Net Core还没有达到2.0版,这就是为什么web API项目中仍然存在一个web.config文件的原因。由于2.0(或者至少我是这么认为的),web.config文件不再存在。相反,默认配置存储在.vs\config\applicationhost.config文件中

出于这个原因,我创建了一个新的解决方案和WebAPI项目,并将其添加到我的Web服务的代码中,同时还添加了
System.Windows.Forms.RichTextBox