92

ローカル マシンで正常に実行されている WCF サービスがあります。サーバーに配置しましたが、次のエラーが表示されます。

http://xx.xx.x.xx:8200/Services/WCFClient.svcへの HTTP 応答の受信中にエラーが発生し ました。これは、サービス エンドポイント バインディングが HTTP プロトコルを使用していないことが原因である可能性があります。これは、HTTP 要求コンテキストがサーバーによって中止されたことが原因である可能性もあります (サービスのシャットダウンが原因である可能性があります)。詳細については、サーバー ログを参照してください。]

URL のサービスにアクセスしましたが、正常に動作しています。関数に対して行っているのは、画像名に文字列を返すことだけなので、渡されるデータはそれほど多くありません。ログをトレースしたところ、同じ情報が得られました。これが私のクライアント設定です:

<binding name="basicHttpBinding_IWCFClient" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                  maxNameTableCharCount="2147483647" />
    <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<endpoint name="basicHttpBinding_IWCFClient" 
    address="http://localhost:4295/Services/WCFClient.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="basicHttpBinding_IWCFClient" 
    behaviorConfiguration="WCFGraphicManagementTool.Services.ClientBehavior"
    contract="WCFClient.IWCFClient" />

これが私のサーバー構成です:

<service behaviorConfiguration="WCFGraphicManagementTool.Services.WCFClientBehavior"
    name="WCFGraphicManagementTool.Services.WCFClient">
   <endpoint name="basicHttpBinding_IWCFClient"
       address="" 
       binding="basicHttpBinding" 
       contract="WCFGraphicManagementTool.Contracts.IWCFClient" />
   <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />
</service>
<behavior name="WCFGraphicManagementTool.Services.WCFClientBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   <serviceThrottling maxConcurrentCalls="120" maxConcurrentSessions="120"
                      maxConcurrentInstances="120" />
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

ローカルマシンで動作するため、サーバー上の設定でしょうか?

4

23 に答える 23

108

シリアライゼーションの問題があると思います。セクションのサービス構成に以下のコードを追加するだけで正確なエラーを見つけることができます<configuration>

構成更新"App_tracelog.svclog"ファイルが作成された後、サービスが存在する場所でファイルを開き.svclog、左側のパネルでエラーである赤い線を見つけ、詳細についてはその説明を参照してください。

これがエラーを見つけるのに役立つことを願っています。

<configuration>
...
...

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>

  </configuration>

更新:"App_tracelog.svclog"更新されたファイル が見つからない場合は、次のように見つけて"<some GUID>App_tracelog.svclog"ください"a39e3026-5dd8-4d39-842a-04d486615eedApp_tracelog.svclog"

于 2013-01-23T14:10:59.430 に答える
77

「これは、HTTPプロトコルを使用していないサービスエンドポイントバインディングが原因である可能性があります」というこの問題があり、WCFサービスがシャットダウンしました(開発マシンで)

私は理解しました:私の場合、問題は列挙型が原因でした、

これを使って解決しました

    [DataContract]
    [Flags]
    public enum Fruits
    {
        [EnumMember]
        APPLE = 1,
        [EnumMember]
        BALL = 2,
        [EnumMember]
        ORANGE = 3 

    }

Enums を DataContract、Flags、および EnumMember 属性を持つすべての列挙型メンバーで装飾する必要がありました。

このmsdnリファレンスを見た後、私はこれを解決しました:

于 2012-08-11T18:56:21.560 に答える
17

これと同じエラーが発生しましたが、問題はシリアル化でした。Service Trace Viewer http://msdn.microsoft.com/en-us/library/ms732023.aspxを使用して実際の問題を見つけ、簡単に解決しました。多分これは誰かを助けるでしょう。

于 2012-01-26T08:06:51.617 に答える
16

私の例では、複雑な型の 1 つに set メソッドのないプロパティがあったため、エラーが生成されました。

そのため、シリアライザーは例外をスローしました。内部設定メソッドを追加し、すべて正常に機能しました。

なぜこれが起こっているのかを知る最善の方法 (私の意見では) は、トレース ログを有効にすることです。

次のセクションを my に追加することでこれを実現しましたweb.config

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
  </sources>
  <trace autoflush="true" />
</system.diagnostics>

設定したら、クライアントを実行して例外を取得し、'Traces.svclog' ファイルを確認しました。そこから、例外を見つけるだけで済みました。

于 2015-01-29T19:09:20.920 に答える
9

DataContract を使用したソリューション、列挙型のフラグは少し見苦しく見えます。私の場合、「NotSet = 0」のようなものを列挙型に追加することで問題が解決しました:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}
于 2013-02-25T06:45:51.720 に答える
2

オブジェクト グラフの循環参照が原因でこのエラーが発生するのを見てきました。子から親オブジェクトへのポインターを含めると、シリアライザーがループし、最終的に最大メッセージ サイズを超えます。

于 2013-03-12T16:47:20.133 に答える
2

私はこれに数日間苦労し、この投稿や他の多くの回答からすべての回答を試し、症状は同じで問題が異なっていたため、私の解決策を共有しました.

問題は、アプリ プールがメモリ制限で構成されていて、一定の期間が経過するとリサイクルされることでした。

これが他の誰かに役立つことを願っています!
ご挨拶、

于 2015-09-10T14:30:57.267 に答える
1

これを解決する最善の方法は、エラーのアドバイスに従うことだと思います。そのため、サーバー ログを探します。追加したログを有効にするには

 <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\TracesServ_ce.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

次に、c:\logs\TracesServ_ce.svclog に移動し、Microsoft サービス トレース ビューアーで開きます。そして、問題が実際に何であるかを見てください。

于 2015-07-06T08:34:23.717 に答える
1

私の問題は、クライアントとサーバーの間で渡されるアイテムが多すぎることでした。両側の動作でこの設定を変更する必要がありました。

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
于 2014-12-09T17:38:47.350 に答える
1

これを修正するには、AppPool ID を管理者アカウントに変更する必要がありました

于 2013-01-17T01:42:42.100 に答える
1

私にとって、このエラーの解決策は非常に奇妙です。EndpointAddressのポートアドレスの問題でした。Visual Studio では、ファイル (Service1.svc など) のポート アドレスと wcf プロジェクトのポート アドレスは、EndpointAddressに指定したものと同じでなければなりません。このソリューションについて詳しく説明します。

ポート アドレスを確認するには、2 つの手順があります。

  1. WCF プロジェクトでサービス ファイル (Service1.svc など) を右クリックします -> [ブラウザーで表示] を選択するよりも、ブラウザーでhttp://localhost:61122/Service1.svcのような URL を持っているので、次のようにポート アドレス 書き留めます。61122

  2. wcf プロジェクトを右クリック -> [プロパティ] を選択 -> [ Web] タブに移動- > [サーバー] セクションに移動-> [ Visual Studio 開発サーバーを使用] を選択 -> [特定のポート]を選択し、以前に Service1 から見つけたポート アドレスを指定します。サービスサービス。つまり(61122)です。

以前は別のポートアドレスを持っていました。EndpointAddressに指定したポートアドレスを適切に指定した後、問題は解決しました。

これで問題が解決することを願っています。

于 2016-10-10T12:13:10.310 に答える
1

私の問題は、サービスの戻り値の型が文字列だったことです。しかし、タイプxmlの文字列を返しました:

<reponse><state>1</state><message>Operation was successfull</message</response>

エラーがスローされました。

于 2013-04-19T09:33:51.113 に答える
1

この問題の詳細については、 「既存の接続がリモート ホストによって強制的に閉じられました - WCF 」も参照してください。

私の問題は、データ転送オブジェクトが複雑すぎることでした。のような単純なプロパティから始めて、それが機能するようpublic long Id { get; set; }になったら、必要に応じて追加のものを追加し始めます。

于 2015-09-10T02:55:30.630 に答える
1

私は問題を理解しました。私の設定ファイルへのパスが間違っていました。WCF のエラーは非常に役立つ場合があります。

于 2011-05-16T13:42:22.630 に答える
1

これには多くの理由が考えられます。以下にそれらのいくつかを示します。

  1. 複雑なデータ コントラクト オブジェクト (つまり、より多くの子カスタム オブジェクトを持つカスタム オブジェクト) を使用している場合は、DataContract および DataMember 属性で装飾されたすべてのカスタム オブジェクトがあることを確認してください。
  2. データ コントラクト オブジェクトが継承を使用する場合は、すべての基本クラスに DataContract 属性と DataMember 属性があることを確認してください。また、基本クラスで [KnownType(typeof(BaseClassType))] 属性を使用して派生クラスを指定する必要があります (詳細については、こちらをご覧ください)。

  3. すべてのデータ コントラクト オブジェクト プロパティに get プロパティと set プロパティの両方があることを確認してください。

于 2013-10-02T18:18:55.870 に答える
0

この問題には一見多くの「解決策」があることに気づきました。wsdl を呼び出している VB.NET アプリケーションで、これと同じエラー メッセージが表示されました。私がアプリケーションを公開したフレームワークは 3.5 で、IT 部門は最近、スケジュール タスクとしてアプリを実行していたアプリケーション サーバーで TLS 1.0 と 1.1 を無効にしました。

アプリケーション フレームワークを 4.5.2 にすることで、この問題は解決しました。

于 2022-01-14T20:26:19.493 に答える