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


87

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

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


ここで説明したように、問題を解決しました:stackoverflow.com/questions/5537794/…–
Adi

あなたは私よりも遠くに行ったようです。おそらく、次に何をすべきかについての指針を私に与えることができます。stackoverflow.com/questions/16628382/...
ニールスBrinch

あなたがまだ答えを得るのを待っているとは思えないので、あなたが答えのいずれかを受け入れる可能性はありますか?:)
ノクティス2014

回答:


100

シリアル化の問題があると思います。正確なエラーを見つけるには、<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>

4
これは実際に私の一日を救った。それは確かにシリアル化の問題System.Runtime.Serializationであり、トレースにソースがありませんでした。
julealgon 2013年

ニース...これに気づいていなかった:)
ノクティス2014

大作!これは、例外では利用できなかったエラーをApp_tracelog.svclogファイルに書き込みます
fubo 2014年

鮮やかさ!ありがとう
SyntaxError 2017年

1
<system.diagnostics>セクションをファイルの最後、すぐ上に貼り付けてください</configuration>。上部に貼り付けると、アプリの実行時にコンテンツタイプエラーが発生する可能性があります。
TawabWakil19年

75

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

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

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

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

    }

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

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


1
ありがとうございました。これはまさに私もしなければならなかったことでした。
マシューコール

1
おかげで、あなたは私に
たくさん

4
どうもありがとう..私の時間を大幅に節約しました
amesh 2013

これに関連して-DataMemberのタイプではないコントラクトに列挙型がある場合、このエラーが発生します。DataMemberであるプロパティを追加し、それに非DataContract列挙型を指定しただけです。
paz 2013年

列挙がインデックス0から始まる必要があるのも事実ではありませんか?これは確かに私にとって過去の問題でした。そう= 0なく1.上記の例リンゴにおける
上院議員


14

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


autoflush = trueが重要でした
Jeremy Smith

9

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

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}

ああ、すみません、さらに上の答えにコメントしました。私もこの振る舞いを見てきました。
上院議員

説明:私は同じ問題を抱えていました。@Rikinの回答により、「InnerExceptionメッセージは「列挙値「0」はタイプに対して無効です...」でした」[ social.msdn.microsoft.com/Forums/vstudio/en-US/…からjemを取得しました。 「ここでの問題は、.. Responseを初期化しておらず、デフォルトの(そして無効な)値である「0」を取得しているため、シリアル化できないことです。」
AJ AJ

3

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

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

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


1

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



1

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


1

このエラーは、契約の不一致が原因である可能性があります。以下の3層アプリケーションについて考えてみましょう...

UIレイヤー
|
プロセスレイヤー
|
データアクセス層
->プロセスとUI層の間のコントラクトには、欠落している同じ列挙型があります(保留= 3)。列挙型:開始= 1、停止= 2。->データアクセスとプロセスレイヤー間のコントラクトには列挙型列挙型:開始= 1、停止= 2、保留= 3があります。

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

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


あなたの答えは質問とは何の関係もないようです。OPはすでに彼の問題を解決していることにも注意してください-設定ファイルへのパスが間違っていました
サイモンMᶜKenzie

1

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

テスト用のHTMLページでは正常に機能しましたが、これをWindowsフォームアプリケーションに配置すると爆発しました。

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

この問題が発生した場合は、既存のサービスに依存するコードの破損を心配する必要がないように、サービスに運用契約を追加することをお勧めします。


1

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

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

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


1

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

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

私は同じ解決策を使用しました。しかし、それがエラーであることを確認するために、@ 100rによって提案されたServiceTraceViewerを使用する必要がありました。
ビョルン2017

1

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

以下の投稿(および解決策)を確認してください

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


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



1

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

問題は、アプリプールがメモリ制限で構成されていて、可変期間後にリサイクルされることでした。

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


1

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

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

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


1

私の場合

私のサービスには download Files

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

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

私はそれが奇妙であることを知っていますが、問題は解決しました

アップロードまたはダウンロード操作を行わない場合、この回答は役に立たない可能性があります


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 DevelopmentServerを使用する]を選択します-> [特定のポート]を選択し、Service1から以前に見つけたポートアドレスを指定します。 svcサービス。それは(61122)です。

以前、私は別のポートアドレスを持っています。EndpointAddressに指定したポートアドレスを正しく指定したところ、問題は解決しました。

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



0

データベース(ビジュアルスタジオで作業中)がある場合は、テーブルに外部キーがないことを確認してください。外部キーがあり、このエラーが発生しました。それらを削除すると、スムーズに実行されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.