在.Net核心API中超出了最大接收消息大小(65536)

nkhmeac6  于 2023-03-09  发布在  .NET
关注(0)|答案(3)|浏览(291)

我们有netcoreapp2.2 API,标准结构,这是program.cs,启动,cs和一些控制器.
我们遇到的问题是,有时它会抛出错误:

Maximum message size quota for incoming messages (65536) has been exceeded

我们在IIS中发布了此API,因此我们只使用dotnet publish - c Release构建API
这将生成bin\Release\netcoreapp2.2\publish文件夹,然后我们将其复制到IIS应用程序
是否有任何代码可以放入Startup.cs,以便生成的web.config具有我们手动决定的MaxReceivedMessageSize,而不是默认值65536
我们的Startup.cs是非常标准的,就像本页中的https://learn.microsoft.com/es-es/aspnet/core/fundamentals/startup?view=aspnetcore-2.2

ccgok5k5

ccgok5k51#

如果你在IIS上托管应用,则需要在IIS级别进行配置,而不是在ASP.NET核心代码中进行配置。dotnet发布过程不会基于ASP.NET核心代码中的内容(如Startup.cs)自定义IIS web.config
但是,您可以在项目的基目录中包含具有以下内容的web.config。转换web.config文件的发布过程将从项目中的现有web.config(如果存在)开始。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="100000000" />
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>

相关文档如下:
如果项目中不存在web.config文件,则使用正确的processPath和参数创建该文件以配置ASP.NET核心模块,并将其移动到已发布的输出。
如果项目中存在web.config文件,则使用正确的processPath和参数转换该文件以配置ASP.NET核心模块,并将其移动到已发布的输出。转换不会修改文件中的IIS配置设置。

umuewwlo

umuewwlo2#

默认情况下,Web服务支持长度为65536的消息。如果要更改Web服务消息长度,请在客户端服务中进行更改。
尝试将maxReceiveMessageSize属性添加到绑定标记。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="EntitySoap" maxReceivedMessageSize="2147483647">
<security mode="Transport" />
</binding>             
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://mywebsite.com/WebServices/DataService.asmx"
binding="basicHttpBinding" bindingConfiguration="EntitySoap"
contract="MyNamespace.EntitySoap" name="EntitySoap" />
</client>
</system.serviceModel>
</configuration>
7qhs6swi

7qhs6swi3#

我们最终用其中一个解决了这个问题:
在我们的代码中,当创建http客户端时:

public PortClient setClient(){
        BasicHttpBinding WSBinding = new BasicHttpBinding();
        WSBinding.MaxReceivedMessageSize = 2000000;
        WSBinding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
        WSBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
        EndpointAddress endpoint = new EndpointAddress(configuration.GetConnectionString("Service"));
        
        
        Lib_PortClient client = new Lib_PortClient(navWSBinding,endpoint);   
        client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
        client.ChannelFactory.Credentials.Windows.ClientCredential = new NetworkCredential("user", "P@ssss");  //System.Net.CredentialCache.DefaultNetworkCredentials;
        return client;
    }

web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <security>
        <requestFiltering>
          <requestLimits maxAllowedContentLength="200000000" />
        </requestFiltering>
      </security>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".\MyApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
    </system.webServer>
  </location>
</configuration>

相关问题