web-dev-qa-db-ja.com

WCF Webサービスエラー:「HTTPプロトコルを使用していないサービスエンドポイントバインディング」?

私の開発マシンでテストしている間、うまく機能している単純なWCFサービスがあります。

これで、WebサービスをWebサーバーに移動し、サービスを(デバッグモードで) http://mydomain.com:8005 で実行しています。そのURLにWebブラウザーを開くと、予期されるサービスページが表示され、呼び出しているインターフェイス内のサーバーにブレークポイントを配置すると、ブレークポイントにヒットして予期されるデータが返されますが、クライアント側では戻ります。次のエラーが発生しました:

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

その他の手がかり:インターフェースの署名は次のとおりです。

IEnumerable<MyClass> GetThings(out string errMsg);

ここで、MyClassはSerializableとして定義されており、定義はクライアントとサーバーの間で同一です。

裏返す必要がある秘密のスイッチは何ですか?

11
Shaul Behr

WCFには、データを渡すためにコンクリートクラスも必要です(すべてがXMLシリアル化可能で、XMLスキーマで表現できる必要があるため、インターフェイスはあまり適していません)。

IEnumerable<T>を返すことができないと思います。代わりにList<T>(またはT[]配列)または具象型を使用してみてください。

運が良ければ?

22
marc_s

サーバーから非常に大量のレコードを返していたため、同じ問題が発生しました。次の行をwcf構成ファイルに追加すると、うまくいきました。

<system.web>
    <httpRuntime maxRequestLength ="262144" executionTimeout="103600"/>
</system.web>
8
zxnet

MyClassをSerializableとして定義しないでください。それを[DataContract]としてマークし、そのプロパティを[DataMember]としてマークします。

できない場合は、まあ...私もその質問がこのあたりにあるのを見たと思います。

[〜#〜]編集[〜#〜]

本質的にブロックするものは何もありませんが、[Serializable]は、シリアライゼーションが処理しきれないほど処理する可能性があります。

編集2

marc_sのコメントが正しい

4

パーティーへの回答が遅れましたが、同じエラーが発生しました。

データコントラクトメンバーに抽象クラスを使用することはできません。私は以下を使わなければなりませんでした:

[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();
2
Sarah Bailey

まったく同じ問題に直面しましたが、サービスがR2(および32ビットで起動、つまりR2にアップグレードできないことを意味する起動)なしで2008サーバーにデプロイされているときに、セキュリティプロトコルタイプがTLS 1.2にハードコーディングされたことが原因でした。

これは他の誰にとっても非常にありそうもないシナリオですが、私が言及したいと思いました。

誰かが同じ状況にあり、次のようなコード行がある場合、なぜ今エラーが発生しているのかがわかります。

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
0
ajeh

誰かに必要な場合に備えて、ここに置いておきます。私は同じエラーに出くわしました。タイプDictionary<int, string>の引数を持つサービスを呼び出していて、キーと値のペアの1つに文字列値がnullに設定されていました。

Null値がないことを確認するようにコードを変更し、それが機能しました

0
Alberto Sadoc

以前のテーブルに変更があり、エンティティを更新しなかった場合、エンティティを更新します。このエラーも発生します

0
sibi elango

私は同じ問題に直面しました。 EndpointAddressのポートアドレスの問題でした。 Visual Studioでは、ファイルのポートアドレス(Service1.svcなど)とwcfプロジェクトのポートアドレスは、EndpointAddressで指定したものと同じである必要があります。このソリューションについて詳しく説明します。

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

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

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

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

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

0
Dilip0165