首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用NetDataContractSerializer将Guid传递给WCF服务

使用NetDataContractSerializer将Guid传递给WCF服务
EN

Stack Overflow用户
提问于 2015-09-23 09:14:48
回答 2查看 1.1K关注 0票数 1

我已经订立了合同

代码语言:javascript
复制
[ServiceContract]
public interface ITestService
{
    [OperationContract]
    [NetDataContract]
    void PassGuid(Guid id);

    [OperationContract]
    [NetDataContract]
    void PassInt(int id);
}

属性NetDataContractAttribute描述了这里。当我调用PassGuid时,会得到一个错误:

附加信息:格式化程序在反序列化消息时抛出一个异常:试图反序列化参数http://tempuri.org/:id时出错。InnerException消息是'XML‘元素'http://tempuri.org/:id’不包含预期的属性'http://schemas.microsoft.com/2003/10/Serialization/:Type‘。反序列化器不知道要反序列化的类型。检查被序列化的类型是否与正在反序列化的类型具有相同的约定。有关更多细节,请参见InnerException。

但是可以没有错误地调用PassInt

完整的源代码这里

编辑:这个问题与发送guids的效率无关,比如这一个,主要是关于使用NetDataContractSerializer。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-24 19:27:36

您正在服务器端使用自定义序列化程序作为NetDataContractSerializerNetDataContractSerializerDataContractSerializer的不同之处在于序列化添加了其他类型信息。

例如,将DatacontractsSerializer序列化为:

代码语言:javascript
复制
<Customer xmlns="http://www.contoso.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <FirstName>Zighetti</FirstName>
  <ID>101</ID>
  <LastName>Barbara</LastName>
</Customer>

NetDataContractSerializer将同一对象序列化为:

代码语言:javascript
复制
<Customer z:Id="1" z:Type="NetDCS.Person" z:Assembly="NetDCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" xmlns="http://www.contoso.com" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
  <FirstName z:Id="2">Zighetti</FirstName>
  <ID>101</ID>
  <LastName z:Id="3">Barbara</LastName>
</Customer>

诱导出更多的类型特异性信息。

在您的示例中,服务器了解NetDataContractSerializer,但客户端不知道。您必须将此行为共享给客户端,将其放入共享代码库中。然后,可以使用以下代码将此enw行为添加到客户端:

代码语言:javascript
复制
       using (var client = new TestServiceClient())
        {
            // Get the channel factory
            var factory = client.ChannelFactory;

            // Attach the behavior
            foreach (OperationDescription desc in factory.Endpoint.Contract.Operations)
            {
                DataContractSerializerOperationBehavior dcsOperationBehavior = desc.Behaviors.Find<DataContractSerializerOperationBehavior>();
                if (dcsOperationBehavior != null)
                {
                    int idx = desc.Behaviors.IndexOf(dcsOperationBehavior);
                    desc.Behaviors.Remove(dcsOperationBehavior);
                    desc.Behaviors.Insert(idx, new WcfClient.NetDataContractAttribute.NetDataContractSerializerOperationBehavior(desc));
                    //return true;

                }
            }

            // pass
            client.PassInt(0);
            // fail
            client.PassGuid(Guid.NewGuid());
            client.Close();
        }

您也可以使用附加行为通过配置文件。

票数 2
EN

Stack Overflow用户

发布于 2015-09-24 15:04:04

问题是客户端自动生成的合同(请参阅文件WcfClient\Service References\TestService\Reference.cs)没有[NetDataContract]属性。

因此,在客户端使用DataContractSerializer

为了使NetDataContractSerializer同时在客户端和服务器上工作,您需要在客户端有适当的契约定义(通过引用服务器DLL或将合同提取到单独的DLL中)。然后,您必须创建自己的代理类(从ClientBase<ITestService>继承),而不是自动生成代理类(或者只使用没有任何代理类的ChannelFactory<ITestService> )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32735496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档