ローカルマシンで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>
ローカルマシンで動作するため、サーバー上の設定になりますか?
私は問題を理解しました。最終的に私の設定ファイルへのパスが間違っていました。 WCFのエラーは非常に役立つ場合があります。
シリアル化の問題があると思います。<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>
「これは、HTTPプロトコルを使用していないサービスエンドポイントバインドが原因である可能性があります」というこの問題が発生し、WCFサービスがシャットダウンしました(開発マシンで)
私が考え出したのは、私の場合、問題は列挙型が原因でした。
これを使って解決しました
[DataContract]
[Flags]
public enum Fruits
{
[EnumMember]
Apple = 1,
[EnumMember]
BALL = 2,
[EnumMember]
ORANGE = 3
}
DataContract、Flags、およびすべての列挙メンバーをEnumMember属性で装飾する必要がありました。
これを見てからこれを解決しました msdn Reference :
これと同じエラーが発生し、問題はシリアル化でした。 Service Trace Viewer http://msdn.Microsoft.com/en-us/library/ms732023.aspx を使用して実際の問題を見つけることができ、簡単に解決できました。たぶんこれは誰かを助けるでしょう。
私のインスタンスでは、複合型の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」ファイルを確認しました。そこから、例外を見つけるだけでした。
DataContractを使用した場合、Flags for Enumsは少しbitいように見えます。私の場合、列挙型に「NotSet = 0」のようなものを追加することで問題が解決しました。
public enum Fruits
{
UNKNOWN = 0,
Apple = 1,
BALL = 2,
ORANGE = 3
}
私は同じ問題に直面しており、以下のコードで解決しました。 (TLS接続の問題がある場合)
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
クライアントチャネルを開く前にこの行を貼り付けてください。
これには多くの理由が考えられます。以下にそれらのいくつかを示します。
データコントラクトオブジェクトが継承を使用する場合、すべての基本クラスにDataContract属性とDataMember属性があることを確認してください。また、基本クラスに、派生クラスを[KnownType(typeof(BaseClassType))]属性で指定する必要があります( こちらの詳細を確認してください )。
すべてのデータコントラクトオブジェクトプロパティにgetプロパティとsetプロパティの両方があることを確認してください。
オブジェクトグラフの循環参照が原因でこのエラーが発生しました。子から親オブジェクトへのポインターを含めると、シリアライザーがループし、最終的に最大メッセージサイズを超えます。
この問題の詳細については、以下も参照してください。 既存の接続がリモートホストによって強制的に閉じられた-WCF
私の問題は、データ転送オブジェクトが複雑すぎることでした。 public long Id { get; set; }
などの単純なプロパティで開始し、必要に応じて追加のものを追加するよりも、その機能が得られたら開始します。
System.Data.DataTableを返すようにWCFサービスを構成したため、この問題が発生しました。
私のテストHTMLページでは問題なく動作しましたが、これをWindowsフォームアプリケーションに配置すると爆発しました。
サービスの運用契約の署名をDataTableからDataSetに変更し、それに応じてデータを返す必要がありました。
この問題がある場合は、既存のサービスに依存するコードを壊すことを心配する必要がないように、サービスに追加の運用契約を追加することができます。
私の問題は、クライアントとサーバー間で渡されるアイテムが多すぎることでした。両側の動作でこの設定を変更する必要がありました。
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
私の問題は、私のサービスの戻り値の型が文字列であるということでした。しかし、タイプxmlの文字列を返しました。
<reponse><state>1</state><message>Operation was successfull</message</response>
そのため、エラーがスローされました。
これを解決する最善の方法は、エラーアドバイスに従うことです。したがって、サーバーログを探します。追加したログを有効にするには
<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サービストレースビューアーで開きます。そして問題が実際に何であるかを見てください。
私の場合
私のサービスにはdownload Files
の機能があります
このエラーはBig Files
をダウンロードしようとしたときにのみ表示されました
だから私は見つけた この答えmaxRequestLength
をweb.config
の必要な値に増やす
私はそれが奇妙だと知っていますが、問題は解決しました
アップロードまたはダウンロード操作を行わない場合、この回答は役に立たないかもしれません
私にとって、このエラーの解決策は非常に奇妙です。 EndpointAddressのポートアドレスの問題でした。 Visual Studioでは、ファイルのポートアドレス(Service1.svcなど)とwcfプロジェクトのポートアドレスは、EndpointAddressに指定したものと同じでなければなりません。このソリューションについて詳しく説明します。
ポートアドレスを確認するには、2つの手順があります。
WCFプロジェクトで、サービスファイル(Service1.svcなど)を右クリックします->を選択するよりもブラウザーで表示ブラウザーでhttp:// localhost:61122/Service1.svcしたがって、ポートアドレスを61122として書き留めます
Wcfプロジェクトを右クリック->Propertiesを選択するより->Webタブに移動-> Now inサーバーセクション->選択Visual Studio開発サーバーを使用->選択特定のポートおよびポートを指定以前にService1.svcサービスから見つけたアドレス。それは(61122)です。
以前、別のポートアドレスがあります。 EndpointAddressに指定したポートアドレスを適切に指定すると、問題が解決しました。
これで問題が解決することを願っています。
また、この問題があり、DataContractおよびDataMember属性でモデルを装飾するのを忘れていたためです
私は数日間これに苦労し、この投稿や他の多くからのすべての回答を試し、症状は同じでしたが問題は異なっていたため、私の解決策を共有しました。
問題は、アプリプールにメモリ制限が設定されており、可変期間後に再生されることでした。
これが他の人の助けになることを願っています!
ご挨拶、
これはあなたの特定の問題とは関係ないかもしれませんが、あなたが言及したエラーメッセージには多くの原因があります。それらの1つは、抽象、インターフェイス、またはWCFクライアントコードに知られていない[OperationContract]の戻り型を使用しています.
以下の投稿(およびソリューション)を確認してください
このエラーは、契約の不一致が原因である可能性があります。以下の3層アプリケーションを検討してください...
UIレイヤー
|
プロセス層
|
データアクセスレイヤー
-> Contract Between ProcessとUIレイヤーには同じ列挙型がありません(Onhold = 3)。列挙:開始= 1、停止= 2->データアクセスとプロセスレイヤー間の契約には列挙があります列挙:開始= 1、停止= 2、保留= 3。
この場合、プロセス層の応答で同じエラーが発生します。
同じエラーは、多層アプリケーションの他のコントラクトの不一致でも発生します。