Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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# 在ASP.NET中,Core FromHeader导致请求.Body被完全读取_C#_Asp.net Core_Asp.net Core Mvc_Asp.net Core Webapi - Fatal编程技术网

C# 在ASP.NET中,Core FromHeader导致请求.Body被完全读取

C# 在ASP.NET中,Core FromHeader导致请求.Body被完全读取,c#,asp.net-core,asp.net-core-mvc,asp.net-core-webapi,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Core Webapi,在ASP.Net Core中,我有以下操作方法: [HttpPost("things")] [DisableFormValueModelBinding] public async Task<IActionResult> UploadAsync() { using StreamReader sr = new StreamReader(Request.Body); string body = await sr.ReadToEndAsync().Conf

在ASP.Net Core中,我有以下操作方法:

[HttpPost("things")]
[DisableFormValueModelBinding]
public async Task<IActionResult> UploadAsync()
{
    using StreamReader sr = new StreamReader(Request.Body);
    string body = await sr.ReadToEndAsync().ConfigureAwait(false);
    int bodyLength = body.Length;
    return Ok();
}
[HttpPost(“东西”)]
[DisableFormValueModelBinding]
公共异步任务UploadAsync()
{
使用StreamReader sr=新的StreamReader(Request.Body);
string body=await sr.ReadToEndAsync().ConfigureAwait(false);
int bodyLength=body.Length;
返回Ok();
}
它很好用。身体是流式的,我可以全部阅读。但是,当我尝试获取标题时:

[HttpPost("things")]
[DisableFormValueModelBinding]
public async Task<IActionResult> UploadAsync(
    [FromHeader(Name = "X-Test")] string test)
{
    using StreamReader sr = new StreamReader(Request.Body);
    string body = await sr.ReadToEndAsync().ConfigureAwait(false);
    int bodyLength = body.Length;
    return Ok();
}
[HttpPost(“东西”)]
[DisableFormValueModelBinding]
公共异步任务上载异步(
[FromHeader(Name=“X-Test”)]字符串测试
{
使用StreamReader sr=新的StreamReader(Request.Body);
string body=await sr.ReadToEndAsync().ConfigureAwait(false);
int bodyLength=body.Length;
返回Ok();
}
正文已经在流的末尾,读取的字节数为零。显然,我是从一个标题中读取的,这不应该影响请求主体。如果我将代码更改为:

[HttpPost("things")]
[DisableFormValueModelBinding]
public async Task<IActionResult> UploadAsync()
{
    string test = Request.Headers["X-Test"].First();
    using StreamReader sr = new StreamReader(Request.Body);
    string body = await sr.ReadToEndAsync().ConfigureAwait(false);
    int bodyLength = body.Length;
    return Ok();
}
[HttpPost(“东西”)]
[DisableFormValueModelBinding]
公共异步任务UploadAsync()
{
string test=Request.Headers[“X-test”].First();
使用StreamReader sr=新的StreamReader(Request.Body);
string body=await sr.ReadToEndAsync().ConfigureAwait(false);
int bodyLength=body.Length;
返回Ok();
}
动作又开始起作用了,我甚至在读标题。如果我切换回FromHeader,它会再次失败。显然,FromHeader在内部做了一些事情,这会干扰请求主体

对我来说,让FromHeader发挥作用非常重要,这样Swagger才能继续发挥作用。没有FromHeader,我无法在Swagger中指定标题值

于是我开始搜索,找到了这个页面:

似乎其他人在使用FromQuery时也遇到了类似的问题,有些人通过以下方式解决了这一问题:

结果: System.IO.IOException:意外的流结束,内容可能已被其他组件读取。位于Microsoft.AspNetCore.WebUtilities.MultipartReaderStream.ReadAsync(字节[]缓冲区、Int32偏移量、Int32计数、CancellationToken CancellationToken)

并“固定”为: [DisableFormValueModelBinding]和Factorys.RemoveType()

程序集Microsoft.AspNetCore.WebUtilities,版本=3.1.0.0 程序集Microsoft.AspNetCore.Mvc.Core,版本=3.1.0.0

仔细检查DisableFormValueModelBindingAttribute代码,确保它正在删除FormFileValueProviderFactory

我去尝试它,看看它是否有什么不同,但在NuGet中我看到的这些库的最新版本是2.2.0和2.2.5,这是我安装的最新稳定版本。而且这些库中还不存在这种类型(FormFileValueProviderFactory)。使用ILSpy进行的检查表明,它确实不存在。VS显示我的目标框架是.NETCore3.1

无论如何,我甚至不确定这是否能解决我的问题

有人对我有什么建议吗


谢谢

我已确认,如果我在我的
DisableFormValueModelBindingAttribute
中的
ValueProviderFactorys
中搜索
FormFileValueProviderFactory
,我只需执行
Where(p=>p.GetType().Name==“FormFileValueProviderFactory”).FirstOrDefault()即可找到它。如果我把它从工厂列表中删除,一切都正常

现在的问题是为什么我不能引用这种类型。由于我已调出类型,我可以查看正在引用的程序集,它是
C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\3.1.10\Microsoft.AspNetCore.Mvc.Core.dll
。这意味着它甚至不使用NuGet,而是使用这个程序集。所以当我发现这个项目为什么要这样设置时,我开始删除旧的和不必要的NuGet引用。助手库中有一些ASP.NET核心MVC实用程序,包括
DisableFormValueModelBindingAttribute
。此库当前配置为
netstandard2.1
,这就是无法引用ASP.NET核心内容的原因

为了解决这个问题,我所要做的就是将目标框架更改为
netcoreapp3.1
,并将其添加到参考ASP.NET Core中:



现在一切正常。

我已经确认,如果我在
ValueProviderFactorys
中搜索
FormFileValueProviderFactory
,在我的
DisableFormValueModelBindingAttribute
中,我可以通过执行
Where(p=>p.GetType().Name==“FormFileValueProviderFactory”).FirstOrDefault()找到它。如果我把它从工厂列表中删除,一切都正常

现在的问题是为什么我不能引用这种类型。由于我已调出类型,我可以查看正在引用的程序集,它是
C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\3.1.10\Microsoft.AspNetCore.Mvc.Core.dll
。这意味着它甚至不使用NuGet,而是使用这个程序集。所以当我发现这个项目为什么要这样设置时,我开始删除旧的和不必要的NuGet引用。助手库中有一些ASP.NET核心MVC实用程序,包括
DisableFormValueModelBindingAttribute
。此库当前配置为
netstandard2.1
,这就是无法引用ASP.NET核心内容的原因

为了解决这个问题,我所要做的就是将目标框架更改为
netcoreapp3.1
,并将其添加到参考ASP.NET Core中:



现在一切正常。

您的目标ASP.NET核心版本是什么?3.1还是2.2?检查您的
csproj
文件
FormFileValueProviderFactory
是在ASP.NET Core 3.0中引入的,是Microsoft.AspNetCore.Mvc.Core
的一部分。如果您的目标框架是
netcoreapp3.1
,那么您应该能够使用
FormFileValueProviderFactory<