gpt4 book ai didi

c# - 将接口(interface)与 WCF 结合使用

转载 作者:行者123 更新时间:2023-11-30 15:09:39 24 4
gpt4 key购买 nike

我已经用 Google 搜索和阅读了几个小时,但找不到任何人处理我的特定情况...

我想在我的 WCF 服务契约(Contract)中使用接口(interface)来松散地耦合线路两端使用的类的服务。这将使我们能够拥有一个仅包含服务和数据契约(仅接口(interface))的低级程序集,我们可以将其交给顾问。在网络的一端,他们​​可以实例化实现我们的数据契约接口(interface)的数据类,通过网络将其发送给我们,然后我们的 WCF 服务会将传入的数据转换/转换/转换为我们的实现相同接口(interface)的数据类的版本。

这是一个例子。 IDataContract包含我想通过电线传输的基本信息。端点和其他特定于 WCF 的配置都是默认的东西(我的问题可能在于此,所以如果那是我需要更改的地方,我可以包含更多)。

编辑:我包含了更多代码并重命名了几个类以帮助减少混淆。 DataContractAttributes 的 Name & Namespace 添加以及配置文件中的两个部分是根据 this blog post 中的信息新增的。 .如果我切换到抽象基类而不是接口(interface),它会起作用。但是,如果可能的话,我想让它与一个界面一起工作。

共享库(我的代码,与客户作者共享):

public interface IDataContract
{
string MyProperty { get; set; }
}
[ServiceContract]
public interface ITestService
{
[OperationContract]
IDataContract TestSharedInterface(IDataContract clientData);
}

客户端代码(他们的):

[DataContract(Name = "IDataContract", Namespace = "http://services.sliderhouserules.com")]
public class ClientDataClass : IDataContract
{
[DataMember]
public string MyProperty { get; set; }
}
private static void CallTestSharedInterface()
{
EndpointAddress address = new EndpointAddress("http://localhost/ServiceContractsTest.WcfService/TestService.svc");
ChannelFactory<ITestService> factory = new ChannelFactory<ITestService>("ITestService", address);
ITestService proxy = factory.CreateChannel();
((IClientChannel)proxy).Open();

IDataContract clientData = new ClientDataClass() { MyProperty = "client data" };
IDataContract serverData = proxy.TestSharedInterface(clientData);
MessageBox.Show(serverData.MyProperty);
}

客户端配置:

<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="ServiceContractsTest.Contracts.DataContracts.IDataContract, ServiceContractsTest.Contracts">
<knownType type="ServiceContractsTest.WcfClient.ClientDataClass, ServiceContractsTest.WcfClient"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>

服务器代码(我的):

public class TestService : ITestService
{
public IDataContract TestSharedInterface(IDataContract clientData)
{
ServerDataClass convertedClientData = (ServerDataClass)clientData;
IDataContract serverData = new ServerDataClass() { MyProperty = convertedClientData.MyProperty + " + server data added" };
return serverData;
}
}
[DataContract(Name = "IDataContract", Namespace = "http://services.sliderhouserules.com")]
public class ServerDataClass : IDataContract
{
[DataMember]
public string MyProperty { get; set; }
}

服务器配置:

<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="ServiceContractsTest.Contracts.DataContracts.IDataContract, ServiceContractsTest.Contracts">
<knownType type="ServiceContractsTest.WcfService.ServerDataClass, ServiceContractsTest.WcfService"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>

我在提示已知类型的客户端调用中收到序列化错误。我只是在那个客户端类中缺少一些元数据标记吗?我什至不知道问题出在哪里,因为我已经尝试了所有我能想到的搜索,但似乎没有人处理过这种特定情况。

基本上,我想要ClientDataClass序列化为 <IDataContract><MyProperty>client data</MyProperty></IDataContract>然后能够将其反序列化为 ServerDataClass实例。这似乎应该是可能的。

最佳答案

如果您的数据协定是接口(interface),WCF 无法知道为传入请求实例化什么对象。类不需要与服务中的相同,毕竟添加服务引用读取 WSDL 并根据 WSDL 中的类型信息生成新类。

关于c# - 将接口(interface)与 WCF 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4192048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com