4

コードで作成された自己ホスト型Webサービスがあります。

protected void StartService(Type serviceType, Type implementedContract, string serviceDescription)
{
    Uri addressTcp = new Uri(_baseAddressTcp + serviceDescription);
    ServiceHost selfHost = new ServiceHost(serviceType, addressTcp);
    Globals.Tracer.GeneralTrace.TraceEvent(TraceEventType.Information, 0, "Starting service " + addressTcp.ToString());
    try
    {
        selfHost.AddServiceEndpoint(implementedContract, new NetTcpBinding(SecurityMode.None), "");

        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        selfHost.Description.Behaviors.Add(smb);
        System.ServiceModel.Channels.Binding binding = MetadataExchangeBindings.CreateMexTcpBinding();
        selfHost.AddServiceEndpoint(typeof(IMetadataExchange), binding, "mex");
        selfHost.Open();

        ServiceInfo si = new ServiceInfo(serviceType, implementedContract, selfHost, serviceDescription);
        try
        {
            lock (_hostedServices)
            {
                _hostedServices.Add(serviceType, si);
            }
        }
        catch (ArgumentException)
        {
             //...
        }
    }
    catch (CommunicationException ce)
    {
        //...
        selfHost.Abort();
    }
}

これは問題なく動作しますが、大量のデータを送信しようとすると、次の例外が発生します。

エラー:フォーマッタがメッセージの逆シリアル化を試みているときに例外をスローしました:パラメータ@@@を逆シリアル化しようとしているときにエラーが発生しました。InnerExceptionメッセージは次のとおりです。'タイプ@@@のオブジェクトの逆シリアル化中にエラーが発生しました。XMLデータの読み取り中に、文字列コンテンツの最大長クォータ(8192)を超えました。このクォータは、XMLリーダーの作成時に使用されるXmlDictionaryReaderQuotasオブジェクトのMaxStringContentLengthプロパティを変更することで増やすことができます。詳細については、InnerExceptionを参照してください。at:at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation、ProxyRpc&rpc)

解決策は、MaxStringContentLengthプロパティをバインディングに追加しているようです。Web.config(リンク)でそれを行う方法を理解しています:

...バインディングname="wsHttpBindingSettings" maxReceivedMessageSize = "2147483647">

コードでバインディングのmaxReceivedMessageSizeを変更する方法を探しています。私が使用しているバインディングのタイプでもそれは可能ですか?

ありがとう。

編集:もう少し学んだ後(そして私が受け取った応答のガイダンスで)私は問題を理解しました:私はそれを宣伝するためだけに使用されるサービスのMEX部分を変更しようとしていました。リンクを参照してください。NetTcpBindingのバインディングを変更する必要がありました(tryステートメントの最初の行)。これで、私の(動作中の)コードは次のようになります。

...
    try
    {
        //add the service itself

        NetTcpBinding servciceBinding = new NetTcpBinding(SecurityMode.None);
        servciceBinding.ReaderQuotas.MaxStringContentLength = 256 * 1024;
        servciceBinding.ReaderQuotas.MaxArrayLength = 256 * 1024;
        servciceBinding.ReaderQuotas.MaxBytesPerRead = 256 * 1024;
        selfHost.AddServiceEndpoint(implementedContract, servciceBinding, "");
...
4

3 に答える 3

2

<ReaderQuotas>バインディングの下のサブ要素を確認する必要があります-MaxStringContentLength設定が存在する場所です....

  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="test">
          <readerQuotas maxStringContentLength="65535" />   <== here's that property!
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>

コードでは、次のように設定できます。

NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);
binding.ReaderQuotas.MaxStringContentLength = 65535;

次に、このバインディングをサービス エンドポイントに使用します ...

selfHost.AddServiceEndpoint(implementedContract, binding, "");
于 2012-12-23T16:57:35.627 に答える
1
var binding = new NetTcpBinding(SecurityMode.None);
binding.MaxReceivedMessageSize = 2147483647;//this your maxReceivedMessageSize="2147483647"
binding.ReaderQuotas.MaxStringContentLength = 2147483647;//this property need set by exception
selfHost.AddServiceEndpoint(implementedContract, binding , "");
于 2012-12-23T16:52:09.337 に答える
0

私のソリューションは、Silverlight クライアントをホストする ASP.NET サイトであり、サービス クライアントの参照はポータブル プロジェクトにあります。サービスは、ユーザー名認証を使用して HTTPS で実行されます。

WCF 経由で画像 (byte[]) を送信するときに問題が発生しましたが、次のように解決しました。

私の Web サイトのweb.configには、次のように定義されたバインディング (system.serviceModel の下) があります。

<bindings>
  <customBinding>
    <binding name="WcfServiceBinding" receiveTimeout="00:10:00" sendTimeout="00:10:00" closeTimeout="00:10:00" openTimeout="00:10:00">
      <security authenticationMode="UserNameOverTransport" />
      <binaryMessageEncoding></binaryMessageEncoding>
      <httpsTransport maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" keepAliveEnabled="true" />
    </binding>
  </customBinding>
</bindings>

ポータブルライブラリで、WCF サービス リファレンスを取得し、コードでバインディングを次のように定義します。

public static CustomBinding ServiceBinding
{
    get
    {
        if (binding != null)
        {
            return binding;
        }

        binding = new CustomBinding
        {
            CloseTimeout = new TimeSpan(0, 2, 0),
            ReceiveTimeout = new TimeSpan(0, 3, 0),
            SendTimeout = new TimeSpan(0, 5, 0)
        };

        var ssbe = SecurityBindingElement.CreateUserNameOverTransportBindingElement();
        binding.Elements.Add(ssbe);
        binding.Elements.Add(new BinaryMessageEncodingBindingElement());
        binding.Elements.Add(
            new HttpsTransportBindingElement { MaxReceivedMessageSize = 2147483647, MaxBufferSize = 2147483647 });

        return binding;
    }
}

クライアントを作成するために、静的バインディング定義を取得します。

private static DataServiceClient CreateClient()
{
    var proxy = new DataServiceClient(ServiceUtility.ServiceBinding, ServiceUtility.DataServiceAddress);
    proxy.ClientCredentials.SetCredentials();
    return proxy;
}

私にとってはうまくいきます。幸運を。

于 2014-06-08T13:16:40.487 に答える