【发布时间】: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 时?如果这就是你的意思,我什至没有机会打电话给它。在调用之前设置服务代理时发生故障。
-
我创建了一个服务并且单个参数使用了它。然后我添加了与您使用相同参数相同的方法并且能够使用它。您是否尝试过从客户端删除该服务并重新添加它