在 ClassLibrary 中使用 WCF 服务时出错

Posted

技术标签:

【中文标题】在 ClassLibrary 中使用 WCF 服务时出错【英文标题】:Error in consuming WCF service in ClassLibrary 【发布时间】:2011-08-06 05:22:22 【问题描述】:

我通过添加 WCF 服务的 Web 引用来使用 classLibrary 中的 WCF。

所有的服务类都显示出来了,它们没有构建错误。

但是在调用服务的方法时,得到下面提到的错误:-

我在包含 xml 的方法中传递了一个对象。

但是当我使用 svcutil.exe 制作代理类时,然后使用具有相同 xml 的相同对象调用服务方法,不会出现错误,它工作正常。

_**这意味着在classLibrary中我们只能通过创建代理而不是添加WCF服务的Web引用来使用WCF服务。

以上说法正确与否?

如果没有,请提供解决方案。**_

**错误:

System.InvalidOperationException: There is an error in XML document (1, 528). ---> System.InvalidOperationException: Instance validation error: '' is not a valid value for PropertySubType.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderHotelFlow.Read29_PropertySubType(String s)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderHotelFlow.Read30_Hotel(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderHotelFlow.Read31_SearchResult(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderHotelFlow.Read100_SearchHotelsResponse()
   at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer8.Deserialize(XmlSerializationReader reader)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at ClassLibTestTouricoWCFinCsharp.com.touricoholidays.demo2.HotelFlow.SearchHotels(SearchRequest request) in C:\Documents and Settings\Prakash.singh\My Documents\Visual Studio 2005\Projects\ClassLibTestTouricoWCFinCsharp\ClassLibTestTouricoWCFinCsharp\Web References\com.touricoholidays.demo2\Reference.cs:line 132
   at ClassLibTestTouricoWCFinCsharp.Class1.test() in C:\Documents and Settings\Prakash.singh\My Documents\Visual Studio 2005\Projects\ClassLibTestTouricoWCFinCsharp\ClassLibTestTouricoWCFinCsharp\Class1.cs:line 78**

【问题讨论】:

【参考方案1】:

您基本上看到了Service Reference and a Web Reference 之间的区别。听起来您正在使用的 WCF 服务与添加 Web 引用不兼容,您应该改用服务引用。

话虽如此,不使用任何一个都更简洁,而是使用ChannelFactory 或通过从ClientBase 派生来创建自己的代理。这是使用 ChannelFactory 的示例。

ChannelFactory<IContract> factory = new ChannelFactory<IContract>("BindingConfigName");
IContract channel = factory.CreateChannel();

channel.YourOperation();

((ICommunicationObject)channel).Close();

【讨论】:

以上是关于在 ClassLibrary 中使用 WCF 服务时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 NetStandard 2.0 类库中托管 WCF 服务

增加C#类库(DLL)调用wcf服务超时

C# WCF之用接口创建服务契约部署及客户端连接

如果我要在 IIS 中托管 WCF 服务,使用 WCF 服务而不是 WCF 库有啥好处?

使用移动设备访问托管在 Windows 服务中的 WCF 服务

在 WCF 服务中使用 protobuf