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

标签 c# .net wcf known-types

我已经用 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/

相关文章:

.net - MVVM 窗口/控件操作

c# - WPF-在第一个组合框选择上启用第二个组合框

c# - 回调中的 WCF 服务超时

c# - 以编程方式调用并呈现 Powerpoint 演示文稿

c# - 从 iframe 中读取查询字符串参数

c# - 使用 LINQ 对列表进行排序

c# - 图元文件到 Multi-Tiff 图像

c# - 在 WCF 服务和独立线程之间进行通信的最佳方式是什么?

.net - WCF 客户端(添加服务引用)讨厌 WebGet 和 WebInvoke ...真的,它确实如此

c# - 显示TimeLine右侧的数据