[英]Wcf Service Library interface type not being exposed
關於我所遇到的問題,我查看了許多示例(包括在WCF服務中傳遞接口? ),但是直到現在還沒有找到解決方案。 我有一個Wcf服務庫(.NET 4.0),具有以下內容
public class Service : IService
{
public bool Ping(IChannelManager channelManager)
{
return channelManager.Ping();
}
}
[ServiceContract]
public interface IService
{
[OperationContract]
bool Ping(IChannelManager channelManager);
}
[ServiceContract]
[ServiceKnownType(typeof(TestChannelName))]
public interface IChannelManager
{
[OperationContract]
bool Ping();
}
[DataContract]
public class TestChannelName : IChannelManager
{
public bool Ping()
{
//perform a ping
return true;
}
}
我的項目編譯正常。 但是,當我嘗試從控制台應用程序將其添加為服務引用時,可以很好地添加它並嘗試訪問如下方法;
using (Test.ServiceClient oClient = new Test.ServiceClient())
{
oClient.Ping();
}
但是我遇到的問題是Wcf服務上的Ping()方法,接口類型是否作為對象channelmanager出現? 喜歡
我嘗試將[ServiceKnownType(typeof(TestChannelName))]添加到兩個接口,但是沒有運氣。
我要去哪里錯了?
我的回答將分為兩部分-關於發生這種情況的技術概述-並對發生這種情況的原因進行哲學思考。
首先從技術上講,如果您看一下:
http://localhost:8733/Design_Time_Addresses/YourProject/Service1/?singlewsdl
從示例代碼創建的wsdl文件,您將找到以下內容:
<xs:element name="Ping">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="channelManager" nillable="true" type="xs:anyType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
要么通過mex,要么如您在wsdl中所見。 您會得到xs:anytype
(實際上是c#對象)。 盡管可以預料到這種行為會令人沮喪,但Mex和WsdlExtractor
僅了解具體類型-服務參數中由[DataContract]
表示的DataMembers,即簡單類型。 其他任何對象都將被視為“對象”,而不是僅僅編譯失敗。
哲學部分:
實際上,您正在嘗試將方法[ServiceContract]
作為參數傳遞。 服務(其邏輯在某些DLL中內置到IL中)不會序列化並通過網絡傳遞-不是因為無法完成-因為這不是它們的用途。
在您的示例中, IChannelManager
是[ServiceContract]
,甚至嘗試將Ping()
導出為[OperationContract]
。 [ServiceKnownType]
屬性無濟於事。
[ServiceKnownType]
有用? 好吧,這是有據可查的,但是要點是-如果您的DataMember在運行時要保留一些具體的類-編譯器無法在編譯時進行推斷(例如,接口,抽象類或基類),那么反序列化器將無法執行猜測嘗試反序列化時應該知道哪些具體類型。
然后,您可能會對我說-聽起來不錯,但我需要將邏輯(服務)作為參數傳遞。 我要說的是-您需要重新設計解決方案。 也許編寫並托管更多服務,並使用與策略或委派模式等效的服務。
我希望其中一些幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.