web-dev-qa-db-ja.com

これは、サービスエンドポイントバインディングがHTTPプロトコルを使用していないことが原因である可能性があります

ローカルマシンで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>

ローカルマシンで動作するため、サーバー上の設定になりますか?

80
Matt Schubert

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

1
Matt Schubert

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

構成の更新後、"App_tracelog.svclog"ファイルが作成されます。サービスが存在する場合、.svclogファイルを開き、左側のパネルでエラーのある赤色の線を見つけて、詳細を確認してください。

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

<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>
90
Rikin Patel

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

私が考え出したのは、私の場合、問題は列挙型が原因でした。

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

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

    }

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

これを見てからこれを解決しました msdn Reference

73
Rajesh

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

17
100r

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

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

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

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」ファイルを確認しました。そこから、例外を見つけるだけでした。

13
Stuart

DataContractを使用した場合、Flags for Enumsは少しbitいように見えます。私の場合、列挙型に「NotSet = 0」のようなものを追加することで問題が解決しました。

public enum Fruits
{
  UNKNOWN = 0,
  Apple = 1,
  BALL = 2,
  ORANGE = 3 
}
8
b1n0m

私は同じ問題に直面しており、以下のコードで解決しました。 (TLS接続の問題がある場合)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

クライアントチャネルを開く前にこの行を貼り付けてください。

2
Abdul Azeez

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

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

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

1
Sujeewa

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

1
Mark Challen

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

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

1
Serj Sagan

System.Data.DataTableを返すようにWCFサービスを構成したため、この問題が発生しました。

私のテストHTMLページでは問題なく動作しましたが、これをWindowsフォームアプリケーションに配置すると爆発しました。

サービスの運用契約の署名をDataTableからDataSetに変更し、それに応じてデータを返す必要がありました。

この問題がある場合は、既存のサービスに依存するコードを壊すことを心配する必要がないように、サービスに追加の運用契約を追加することができます。

1
jp2code

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

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
1
Rob Sedgwick

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

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

そのため、エラーがスローされました。

1
joettriscik

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

 <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サービストレースビューアーで開きます。そして問題が実際に何であるかを見てください。

1
Lomithrani

私の場合

私のサービスにはdownload Filesの機能があります

このエラーはBig Filesをダウンロードしようとしたときにのみ表示されました

だから私は見つけた この答えmaxRequestLengthweb.configの必要な値に増やす

私はそれが奇妙だと知っていますが、問題は解決しました

アップロードまたはダウンロード操作を行わない場合、この回答は役に立たないかもしれません

0

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

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

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

  2. Wcfプロジェクトを右クリック->Propertiesを選択するより->Webタブに移動-> Now inサーバーセクション->選択Visual Studio開発サーバーを使用->選択特定のポートおよびポートを指定以前にService1.svcサービスから見つけたアドレス。それは(61122)です。

以前、別のポートアドレスがあります。 EndpointAddressに指定したポートアドレスを適切に指定すると、問題が解決しました。

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

0
Dilip0165

また、この問題があり、DataContractおよびDataMember属性でモデルを装飾するのを忘れていたためです

0
Ian Rathbone

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

問題は、アプリプールにメモリ制限が設定されており、可変期間後に再生されることでした。

これが他の人の助けになることを願っています!
ご挨拶、

0
Gonza Oviedo

これはあなたの特定の問題とは関係ないかもしれませんが、あなたが言及したエラーメッセージには多くの原因があります。それらの1つは、抽象、インターフェイス、またはWCFクライアントコードに知られていない[OperationContract]の戻り型を使用しています.

以下の投稿(およびソリューション)を確認してください

https://stackoverflow.com/a/5310951/74138

0
modeeb

このエラーは、契約の不一致が原因である可能性があります。以下の3層アプリケーションを検討してください...

UIレイヤー
|
プロセス層
|
データアクセスレイヤー
-> Contract Between ProcessとUIレイヤーには同じ列挙型がありません(Onhold = 3)。列挙:開始= 1、停止= 2->データアクセスとプロセスレイヤー間の契約には列挙があります列挙:開始= 1、停止= 2、保留= 3。

この場合、プロセス層の応答で同じエラーが発生します。

同じエラーは、多層アプリケーションの他のコントラクトの不一致でも発生します。

0
Abhijit Kumar