如何确保WCF ChannelFactory在xml配置中使用绑定设置(忽略MaxArrayLength)

Pla*_*fan 6 wcf config wcf-binding wcf-client

如何确保WCF ChannelFactory在xml配置中使用绑定设置(忽略MaxArrayLength)

嗨,我是Wcf的新手,并且写了我的第一个Wcf服务和客户端.我不想使用工具来生成配置; 我宁愿自己编写配置.我试图解决的问题是客户端通过netTcp与服务进行通信.该服务可能会返回非常大的有效负载(比默认的readerQuotas.maxArrayLength更好).当字节流有效载荷相对较低时(即小于它认为约为16K的默认值),我最初开发的组件工作正常.我可以通过创建绑定并将MaxArrayLength设置为足够大的值来以编程方式解决此问题.但是,我需要能够在xml配置中执行等效操作.

我的app.config(客户端)是:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>

        <client>
            <endpoint address="net.tcp://localhost:9000/WcfDataService/RemoteDataRequesterService/"
                binding="netTcpBinding" bindingConfiguration="unsecureNetTcpBinding"
                contract="WcfDataServiceLib.IRemoteDataRequester"
                name="DataRequesterEndpoint" />
        </client>

        <bindings>
            <netTcpBinding>
                <binding name="unsecureNetTcpBinding" maxReceivedMessageSize="2147483647">
                    <readerQuotas maxArrayLength="1000000" />
                    <security mode="None" />
                </binding>
            </netTcpBinding>
        </bindings>

    </system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)

创建客户端代理的代码如下:

private void Init()
{
    var address = new EndpointAddress(@"net.tcp://localhost:9000/WcfDataService/RemoteDataRequesterService/");
    const string endpointName = "DataRequesterEndpoint";

    ChannelFactory<IRemoteDataRequester> factory = new ChannelFactory<IRemoteDataRequester>(
        endpointName);

    IRemoteDataRequester proxy = factory.CreateChannel(address);

    // call business methods on proxy ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,代码通过变量"endpointName"链接到配置.

服务端配置(我不认为这是相关的,但包括完整性):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <services>
            <service name="WcfDataServiceLib.RemoteDataRequesterService" behaviorConfiguration="WcfDataServiceLib.RemoteDataRequesterServiceBehavior">
                <host>
                    <baseAddresses>
                        <add baseAddress = "net.tcp://localhost:9000/WcfDataService/RemoteDataRequesterService" />
                        <add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfDataService/RemoteDataRequesterService/"/>
                    </baseAddresses>
                </host>
                <endpoint address ="" binding="netTcpBinding" bindingConfiguration="netTcpBindingConfig" contract="WcfDataServiceLib.IRemoteDataRequester">
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="WcfDataServiceLib.RemoteDataRequesterServiceBehavior">
                    <serviceMetadata httpGetEnabled="False"/>
                    <serviceDebug includeExceptionDetailInFaults="True" />
                </behavior>
            </serviceBehaviors>
        </behaviors>

        <bindings>
            <netTcpBinding>
                <binding name="netTcpBindingConfig" receiveTimeout="00:00:30">
                    <readerQuotas maxArrayLength="1000000"/>
                </binding>
                <binding name="netTcpReliableSession" receiveTimeout="00:00:30" >
                    <reliableSession enabled="true"/>
                </binding>
            </netTcpBinding>
        </bindings>

    </system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)

当我在服务返回大字节流的场景中运行客户端时,抛出异常并且异常内的消息是:

发生通信错误:套接字连接中止.这可能是由于处理消息的错误或远程主机超出接收超时或基础网络资源问题引起的.本地套接字超时为'00:00:59.9687494'

(这不是超时,因为错误会立即发生.)

如前所述,我可以通过以下方式以编程方式解决此问题:

var binding = new NetTcpBinding
{
    ReaderQuotas = { MaxArrayLength = 10000000 }
};

return new ChannelFactory<IRemoteDataRequester>(binding);
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我需要通过配置进行测试.

我也尝试过以下方法:

var binding = new NetTcpBinding("unsecureNetTcpBinding");
return new ChannelFactory<IRemoteDataRequester>(binding);
Run Code Online (Sandbox Code Playgroud)

但这没有区别.

所以我的问题是,为什么当我从端点配置创建包含MaxArrayLength设置为合适值的绑定的通道时,忽略该值?

很多问候.

好的,我找到了解决方案.配置一直在努力.但是,我提供的配置("unsecureNetTcpBinding"),我从一个代码示例中找到了说明http服务(不是我正在设计的net tcp服务).流氓的配置是'安全模式="无"'当我把它拿出来时,它起作用了.如果我更改readerQuotas maxArrayLength,这将按我的要求应用.我的代码工作的原因是因为我没有将安全模式设置为none.感谢您的意见和帮助.

Kla*_*sen 1

我认为问题可能是在配置中你的数字只有 6 个零,而在代码中你有 7 个零。或许?