私の開発マシンでテストしている間、うまく機能している単純なWCFサービスがあります。
これで、WebサービスをWebサーバーに移動し、サービスを(デバッグモードで) http://mydomain.com:8005 で実行しています。そのURLにWebブラウザーを開くと、予期されるサービスページが表示され、呼び出しているインターフェイス内のサーバーにブレークポイントを配置すると、ブレークポイントにヒットして予期されるデータが返されますが、クライアント側では戻ります。次のエラーが発生しました:
http://mydomain.com:8005/ へのHTTP応答の受信中にエラーが発生しました。これは、サービスエンドポイントバインディングがHTTPプロトコルを使用していないことが原因である可能性があります。これは、HTTPリクエストコンテキストがサーバーによって中止されたことが原因である可能性もあります(おそらくサービスのシャットダウンが原因です)。詳細については、サーバーログを参照してください。
その他の手がかり:インターフェースの署名は次のとおりです。
IEnumerable<MyClass> GetThings(out string errMsg);
ここで、MyClass
はSerializableとして定義されており、定義はクライアントとサーバーの間で同一です。
裏返す必要がある秘密のスイッチは何ですか?
WCFには、データを渡すためにコンクリートクラスも必要です(すべてがXMLシリアル化可能で、XMLスキーマで表現できる必要があるため、インターフェイスはあまり適していません)。
IEnumerable<T>
を返すことができないと思います。代わりにList<T>
(またはT[]
配列)または具象型を使用してみてください。
運が良ければ?
サーバーから非常に大量のレコードを返していたため、同じ問題が発生しました。次の行をwcf構成ファイルに追加すると、うまくいきました。
<system.web>
<httpRuntime maxRequestLength ="262144" executionTimeout="103600"/>
</system.web>
MyClassをSerializableとして定義しないでください。それを[DataContract]としてマークし、そのプロパティを[DataMember]としてマークします。
できない場合は、まあ...私もその質問がこのあたりにあるのを見たと思います。
[〜#〜]編集[〜#〜]
本質的にブロックするものは何もありませんが、[Serializable]は、シリアライゼーションが処理しきれないほど処理する可能性があります。
編集2
marc_sのコメントが正しい
パーティーへの回答が遅れましたが、同じエラーが発生しました。
データコントラクトメンバーに抽象クラスを使用することはできません。私は以下を使わなければなりませんでした:
[DataContract]
public class MyClass {
[DataMember]
public A MyProperty { get; set; }
}
[DataContract]
[KnownType(typeof(B))]
[KnownType(typeof(C))]
public class A {
}
[DataContract]
public class B : A {
}
[DataContract]
public class C : A {
}
WCFが次のようなものをシリアル化できるようにするため
var myClass = new MyClass();
myClass.MyProperty = new B();
まったく同じ問題に直面しましたが、サービスがR2(および32ビットで起動、つまりR2にアップグレードできないことを意味する起動)なしで2008サーバーにデプロイされているときに、セキュリティプロトコルタイプがTLS 1.2
にハードコーディングされたことが原因でした。
これは他の誰にとっても非常にありそうもないシナリオですが、私が言及したいと思いました。
誰かが同じ状況にあり、次のようなコード行がある場合、なぜ今エラーが発生しているのかがわかります。
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
誰かに必要な場合に備えて、ここに置いておきます。私は同じエラーに出くわしました。タイプDictionary<int, string>
の引数を持つサービスを呼び出していて、キーと値のペアの1つに文字列値がnullに設定されていました。
Null値がないことを確認するようにコードを変更し、それが機能しました
以前のテーブルに変更があり、エンティティを更新しなかった場合、エンティティを更新します。このエラーも発生します
私は同じ問題に直面しました。 EndpointAddressのポートアドレスの問題でした。 Visual Studioでは、ファイルのポートアドレス(Service1.svcなど)とwcfプロジェクトのポートアドレスは、EndpointAddressで指定したものと同じである必要があります。このソリューションについて詳しく説明します。
ポートアドレスを確認するには、2つの手順があります。
WCFプロジェクトでサービスファイル(Service1.svcなど)を右クリックし、選択よりもブラウザで表示をブラウザで実行すると、次のようなURLが表示されますhttp:// localhost:61122/Service1.svcしたがって、ポートアドレスを書き留めます61122として
Wcfプロジェクトを右クリックします->選択よりプロパティ->Webタブに移動します->現在Serversセクション->選択Visual Studio開発サーバーを使用-> selectSpecific PortとService1.svcサービスから以前に見つけたポートアドレスを指定します。つまり、(61122)です。
以前、私は別のポートアドレスを持っています。 EndpointAddressに入力したポートアドレスを正しく指定すると、問題が解決しました。
これで問題が解決することを願っています。