2010-12-03 3 views
9

コンソールアプリケーションでいくつかのWebサービスをホストするために使用されているWebServiceHostがあります。私は私のクライアントアプリで、それにサービス参照を追加し、そうのようなプロキシを作成:[OperationContract]メソッドで複数のパラメータが使用されていると、WCFサービスプロキシが例外をスローします

var binding = new WebHttpBinding(); 
var endPoint = new EndpointAddress(string.Format(Settings.serviceBase, Settings.wcfPort)); 

ChannelFactory<IzWaveSVC> factory = new ChannelFactory<IzWaveSVC>(new WebHttpBinding(), endPoint); 

factory.Endpoint.Behaviors.Add(new WebHttpBehavior()); 
// **Exception occurs here** 
var proxy = (IzWaveSVC)factory.CreateChannel(); 

それは動作しますが、私は複数のパラメータを必要とする新しい方法を追加したら、私はときにプロキシこの例外を取得し始めました(任意の通信も行われた前にこれがあった)に作成されました:

Operation 'setDeviceState' of contract 'IzWaveSVC' specifies multiple request 
body parameters to be serialized without any wrapper elements. At most one 
body parameter can be serialized without wrapper elements. Either remove the 
extra body parameters or set the BodyStyle property on the WebGetAttribute/
WebInvokeAttribute to Wrapped. 

WebInvokeAttributeを追加してラップにbodyStyle属性を設定しても効果はありません。

[OperationContract] 
[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]   
bool setDeviceState(byte nodeId, bool powered, byte level); 

私は他の方法もありますが、それらは単一のパラメータしか持たないので、上記の問題はありません。すべてのヘルプは高く評価され

endPoint = new EndpointAddress(string.Format(Settings.serviceBase, port)); 
binding = new WebHttpBinding(); 

host = new WebServiceHost(singletonObject, new Uri(string.Format(Settings.serviceBase, port))); 

host.AddServiceEndpoint(typeof(IzWaveSVC), binding, ""); 
ServiceMetadataBehavior mexBehavior = new ServiceMetadataBehavior();     
mexBehavior.HttpGetEnabled = true; 
host.Description.Behaviors.Add(mexBehavior);     
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), endPoint.Uri.AbsoluteUri + "mex");  
host.Open();    

ちょうどFYI、ここではどのように私のセットアップホストです。

ありがとうございます!

+0

こんにちは、私の目が正しく動作していない可能性があります。しかし、私はあなたがこのメソッドをどのように呼び出すのか分かりません。メソッドを呼び出す方法についてコードを投稿できますか? –

+0

@Alex - メソッドを呼び出すと、クライアントからsetDeviceStateを呼び出すと言っていますか?それがあなたが意味するものなら、私はそれを呼び出すチャンスも得られません。呼び出しが行われる前に、サービスへのプロキシを設定する際にエラーが発生します。 – bugfixr

+0

私はサービスを作成しましたが、単一のパラメータがそれを消費しました。次に、同じパラメーターを使って同じメソッドを追加し、それを消費することができました。クライアントからサービスを削除してもう一度追加しようとしました –

答えて

15

VSの[サービス参照の追加]ダイアログを使用してプロキシコードを作成したようです。 VS ASRダイアログはWCF RESTを完全にサポートしていないため、プロキシコードには[WebInvoke]という属性がありません。クライアントプロキシの操作に[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]属性を追加できますか?

をあなたは、私が

[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)] 

操作上の属性を追加する必要がありましたができない場合は、

<behaviors> 
    <endpointBehaviors> 
    <behavior> 
     <!--<webHttp/>--> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

から<webHttp/>

を削除することができた場合:私が見つけた

+0

ASRで生成されたコードのReference.csファイルに追加しましたが、実際に動作しました。 reference.csファイルを変更するのではなく、コールステージで同じことを達成する方法はありますか?私は私のサービスをリフレッシュするたびに、そのファイルを更新することを忘れてはいけません。 – bugfixr

+2

クライアントプロキシの操作の属性はどういう意味ですか?私はそれらをWCFライブラリに追加しましたが、私の質問 – AMH

+0

@bugfixrを参照ファイルに追加しても動作しません。何も変更されていないかのように同じエラーが発生し続けます – jonayreyes

5

2つの溶液連絡方法

+0

しかし、 ://stackoverflow.com/questions/11466537/wcf-strange-behaviour – AMH

1

Visual Studio内でサービスのホスティング環境を変更してみてください。
Use local IISから 'Use Visual Studio Development Server'に変更します。

明らかに、ホスティング環境によって異なる動作があります。

0

[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)]を操作連絡先メソッドに追加しても、この問題の別のシナリオがありますが、それでも機能しません。この投稿は私の問題を解決しています。我々は単純にサービス参照を追加した後 生成されたファイル「reference.cs」を探している行うために必要なものhttp://www.codemeit.com/wcf/wcf-restful-pox-json-and-soap-coexist.html

。検索キーワード:クライアントプロジェクト内で "public interface ITestService"を検索すると、 サービス契約が見つかり、 OperationContractの上に[System.ServiceModel.Web.WebGet]を追加します。

私はクライアント側のプロキシクラスのOprationContractの上に[System.ServiceModel.Web.WebGet]を追加していました。

関連する問題