WCF:独自のWCFサービスに電話することはできません
-
09-10-2019 - |
質問
私はWCFサービスを持っています。MSTESTプロジェクトからそれへの参照を作成しました。これが私がサービス方法を呼び出している方法です:
IEnrollmentService serviceClient = ChannelFactory<IEnrollmentService>
.CreateChannel(new BasicHttpBinding(),
new EndpointAddress("http://localhost/EnrollmentService.svc"));
PublishResult res = serviceClient.PublishEnrollmentProfile(...);
実行の代わりに、次のエラーがあります。
コンテンツタイプアプリケーション/XML;応答メッセージのcharset = utf-8は、バインディングのコンテンツタイプと一致しません(text/xml; charset = utf-8)。カスタムエンコーダーを使用する場合は、iSContentTypesportedメソッドが適切に実装されていることを確認してください。応答の最初の710バイトは次のとおりです。
Sendera:ActionNotSupported
アクションを使用したメッセージは、endpointDispatcherでのContractFilterの不一致のため、受信機で処理することはできません。これは、契約の不一致(送信者とレシーバー間の不一致のアクション)または送信者と受信機の間の拘束力/セキュリティの不一致のいずれかが原因である可能性があります。送信者と受信者が同じ契約と同じ拘束力のある拘束力を持っていることを確認します(セキュリティ要件、例:メッセージ、トランスポート、なし)。 ---> System.net.Webexception:リモートサーバーはエラーを返しました:(500)内部サーバーエラー。
私が理解した限り、ContractFilterとEndpointDispatcherの間にはいくつかの問題があります。私は善をしようとしましたが、理解できるものは何も見つかりませんでした...
また、別の方法でWCFサービスメソッドに電話しようとしました。
EnrollmentServiceClient serviceClient = new EnrollmentServiceClient("http://localhost/EnrollmentService.svc");
PublishResult res = serviceClient.PublishEnrollmentProfile(...);
それは私に別のエラーを返します:
名前のエンドポイント要素が見つかりませんでした 'http://localhost/mcactivation/enrollmentservice.svc'およびcontract' enrollmentservicerenference.ienrollmentservice 'ServiceModelクライアント構成セクション。これは、アプリケーションに構成ファイルが見つからなかったか、この名前を一致させるエンドポイント要素がクライアント要素に見つかったためであるためかもしれません。
質問1:
WCFサービスクライアントをインスタンス化する正しい方法は何ですか?
質問2:
私の場合は何が悪いのですか?
どうもありがとう。
PSいくつかの問題がある私はWCFTESTCLIENTでサービスに接続できます、詳細はこちらをご覧ください:WCFサービス:「webhttpbinding」エンドポイントを介してメソッドを呼び出すことはできません
ここにあるPPSはサーバー側のWCFサービス構成です。
<system.serviceModel>
<services>
<service name="McActivationApp.EnrollmentService" behaviorConfiguration="McActivationApp.EnrollmentServicBehavior">
<endpoint address="" binding="webHttpBinding" contract="McActivationApp.IEnrollmentService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="McActivationApp.IEnrollmentService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="McActivationApp.EnrollmentServicBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
解決
あなたの問題はこれです:あなた サービス構成 aを定義します webHttpBinding
エンドポイント - それはaです 残り ( "xml-over-http")エンドポイント....
それでも、クライアントはaを使用します basicHttpBinding
そして、これはです 石鹸 バインディング - それらはそうです いいえ 互換性!
これを変更して、サービス側が提供するサービスエンドポイントが、クライアントがそれに接続できるようにする必要があります。
それで:
- どちらかを使用してサービス構成に別のエンドポイントを追加します
basicHttpBinding
そのエンドポイントに接続します
また:
- 使用するためにクライアント側を変更します
webHttpBinding