【问题标题】:why my WCF client gets empty result?为什么我的 WCF 客户端得到空结果?
【发布时间】:2009-07-16 08:55:04
【问题描述】:

我正在使用 VSTS 2008 + .Net + C# 3.5 开发 WCF 服务(作为 Windows 服务自托管)。从客户端,我使用 ChannelFactory 连接到 WCF 服务。我的困惑是,当我将客户端代码从“公共字符串响应”更改为“公共字符串 responseAliasName”时,responseAliasName 的值为 null。但是当改回变量名响应时,响应值是正确的(值为“hi WCF”)。

我的困惑是,我认为变量名称应该无关紧要,只要客户端和服务器端的布局相同。有什么想法有什么问题吗?

服务器端代码:

namespace Foo
{
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
    [ServiceContract]
    public interface IFoo
    {
        [OperationContract]
        FooResponse Submit(string request);
    }

    [DataContract]
    public class FooResponse
    {
        [DataMember]
        public string response;
    }
}

namespace Foo
{
    // NOTE: If you change the class name "Service1" here, you must also update the reference to "Service1" in Web.config and in the associated .svc file.
    public class FooImpl : IFoo
    {
        public FooResponse Submit(string request)
        {
            FooResponse foo = new FooResponse();
            foo.response = "hi WCF";
            return foo;
        }
    }
}

客户端代码:

namespace Foo
{
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
    [ServiceContract]
    public interface IFoo
    {
        [OperationContract]
        FooResponse Submit(string request);
    }

    [DataContract]
    public class FooResponse
    {
        [DataMember]
        // public string responseAliasName;
        public string response;
    }
}


namespace FooTestClient1
{
    class Program
    {
        static void Main(string[] args)
        {
            ChannelFactory<IFoo> factory = new ChannelFactory<IFoo>(
               "IFoo");
            IFoo f = factory.CreateChannel();
            FooResponse response = f.Submit("Hi!");

            return;
        }
    }
}

【问题讨论】:

    标签: c# .net wcf visual-studio-2008


    【解决方案1】:

    你可以使用

    [DataContract(Name="ResponseAliasName")]
    public string response;
    

    在服务器端,它会像你期望的那样工作,DataContract 默认使用字段或属性名称来序列化数据,服务器找不到正确的数据

    【讨论】:

      【解决方案2】:

      不,成员名称包含在序列化中。如果您在客户端更改它,它无法反序列化回该成员。

      【讨论】:

        【解决方案3】:

        George,为什么不直接使用“添加服务引用”来创建您的客户端?如您所见,手动创建客户端服务合同很危险。

        【讨论】:

        • 我见过一些场景,尤其是在处理 REST WCF 时,依赖 svcutil 创建合同是个坏主意。
        【解决方案4】:

        我的困惑是,当 我将客户端代码从“公共 字符串响应”到“公共字符串 responseAliasName",的值 responseAliasName 为空。但当 改回变量名响应, 响应值正确(值 是“嗨 WCF”)。 我的困惑是,我认为变量名 应该没关系,只要 布局与客户端相同,并且 服务器端。有什么想法有什么问题吗?

        您在客户端本地使用的变量名称完全不相关——服务器对此一无所知。给定您来自客户端的代码 sn-p:

        ChannelFactory<IFoo> factory = new ChannelFactory<IFoo>("IFoo");
        IFoo f = factory.CreateChannel();
        FooResponse response = f.Submit("Hi!");
        

        这会起作用 - 没问题:

        FooResponse myResponseVar1 = f.Submit("Hi!");
        

        这也是这样:

        FooResponse someReallyCleverVariableNameWhateverItMightBe = f.Submit("Hi!");
        

        DataContract当然是服务和客户必须同意的共享元素!您不能在本地更改数据协定中元素的名称 - 毕竟,这才是真正描述您的调用将如何转换为 XML 消息的内容,并且这些点点滴滴必须在服务器和客户端之间保持同步以便客户端能够将从服务器接收到的消息转换回对象供您使用。

        ServiceContract 和 DataContract必须在两端都相同 - 这是基本要求,否则,几乎什么都不会发生。

        马克

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-05
          • 1970-01-01
          • 1970-01-01
          • 2012-09-30
          • 1970-01-01
          相关资源
          最近更新 更多