【问题标题】:WCF Service Proxy throws exception when more than one parameter is used in [OperationContract] method当 [OperationContract] 方法中使用多个参数时,WCF 服务代理抛出异常
【发布时间】:2011-05-19 19:03:53
【问题描述】:

我有一个 WebServiceHost,用于在控制台应用程序中托管一些 Web 服务。我在我的客户端应用程序中添加了对它的服务引用并像这样创建代理:

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 设置为 Wrapped 无效:

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

感谢任何帮助。

谢谢!

【问题讨论】:

  • 嗨,我的眼睛可能工作不正常。但我不明白你是如何调用该方法的。您可以发布有关如何调用该方法的代码吗?
  • @Alex - 当你说调用方法时,你是说当我从客户端调用 setDeviceState 时?如果这就是你的意思,我什至没有机会打电话给它。在调用之前设置服务代理时发生故障。
  • 我创建了一个服务并且单个参数使用了它。然后我添加了与您使用相同参数相同的方法并且能够使用它。您是否尝试过从客户端删除该服务并重新添加它

标签: c# asp.net c#-4.0 wcf


【解决方案1】:

您似乎已经使用 VS 中的“添加服务引用”对话框创建了代理代码。 VS ASR 对话框不完全支持 WCF REST,因此代理代码缺少 [WebInvoke] 属性。您可以尝试在客户端代理中的操作上添加[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] 属性吗?

【讨论】:

  • 我将它添加到我的 ASR 生成的代码中,在 Reference.cs 文件中,它确实有效。有没有办法在调用阶段完成同样的事情,而不必修改 reference.cs 文件?我不想每次刷新服务时都必须记住更新该文件....
  • 客户端代理中操作的属性是什么意思? ,我将它们添加到 WCF 库中,但无法正常工作,请参阅我的问题
  • @bugfixr 即使将其添加到参考文件中,它也会不断吐出相同的错误,好像什么都没有改变
【解决方案2】:

我找到了两个解决方案:

如果你可以删除&lt;webHttp/&gt;

来自

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

如果不能,我必须添加属性

[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)]

以上操作联系方式

【讨论】:

【解决方案3】:

尝试在 Visual Studio 中更改服务的托管环境。
将其从 Use local IIS 更改为“使用 Visual Studio 开发服务器”。

显然有不同的行为取决于托管环境。

【讨论】:

    【解决方案4】:

    在客户端更新 tha app.config 并将 defaultBodyStyle 设置为 WrappedRequest 对我有用,而删除 webHttp 会导致其他问题。

    <behaviors>
      <endpointBehaviors>
        <behavior name="webHttp">
          <webHttp defaultBodyStyle="WrappedRequest"/>
        </behavior>
      </endpointBehaviors>
    

    【讨论】:

      【解决方案5】:

      我有这个问题的另一种情况,即使我在操作联系方法上添加了[WebInvoke(BodyStyle = WebMessageBodyStyle.WrappedRequest)],它仍然不起作用,我发现这篇文章解决了我的问题。 http://www.codemeit.com/wcf/wcf-restful-pox-json-and-soap-coexist.html

      我们需要做的只是找到生成的文件“reference.cs” 添加服务参考后。搜索关键词:“公共接口 ITestService”在客户端项目中,你会发现生成的 服务合同,在顶部添加 [System.ServiceModel.Web.WebGet] 操作合同。

      所以我在客户端代理类的 OprationContract 顶部添加了 [System.ServiceModel.Web.WebGet],它可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-01
        • 2011-11-16
        • 1970-01-01
        相关资源
        最近更新 更多