Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的WCF客户端得到空结果?_C#_.net_Wcf_Visual Studio 2008 - Fatal编程技术网

C# 为什么我的WCF客户端得到空结果?

C# 为什么我的WCF客户端得到空结果?,c#,.net,wcf,visual-studio-2008,C#,.net,Wcf,Visual Studio 2008,我正在使用VSTS 2008+.Net+C#3.5开发WCF服务(作为Windows服务自托管)。从客户端,我使用ChannelFactory连接到WCF服务。我的困惑是,当我将客户端代码从“publicstringresponse”更改为“publicstringresponsealiasname”时,responseAliasName的值为null。但当更改回变量名响应时,响应值是正确的(值为“hi WCF”) 我的困惑是,我认为变量名应该无关紧要,只要客户端和服务器端的布局相同。你知道怎么

我正在使用VSTS 2008+.Net+C#3.5开发WCF服务(作为Windows服务自托管)。从客户端,我使用ChannelFactory连接到WCF服务。我的困惑是,当我将客户端代码从“publicstringresponse”更改为“publicstringresponsealiasname”时,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;
        }
    }
}
客户端代码:

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;
        }
    }
}
名称空间Foo
{
//注意:如果在此处更改接口名称“IService1”,还必须在Web.config中更新对“IService1”的引用。
[服务合同]
公共接口IFoo
{
[经营合同]
FooResponse提交(字符串请求);
}
[数据合同]
公开课回应
{
[数据成员]
//公共字符串responseAliasName;
公共字符串响应;
}
}
命名空间FooTestClient1
{
班级计划
{
静态void Main(字符串[]参数)
{
ChannelFactory=新的ChannelFactory(
“IFoo”);
IFoo f=factory.CreateChannel();
FooResponse=f.Submit(“嗨!”);
返回;
}
}
}

否,成员名称包含在序列化中。如果在客户端对其进行更改,则无法将其反序列化回该成员。

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

您可以使用

[DataContract(Name="ResponseAliasName")]
public string response;
在服务器端,它将按照您的预期工作,默认情况下,DataContract使用字段或属性名来序列化数据,而服务器无法找到您可以使用的正确数据

[DataContract(Name="ResponseAliasName")]
public string response;
在服务器端,它将按照您的预期工作,DataContract默认使用字段或属性名称来序列化数据,而服务器无法找到正确的数据。George,为什么不使用“添加服务引用”来创建您的客户机呢?正如您所看到的,手工创建客户端服务合同是危险的。

George,为什么不使用“添加服务引用”来创建您的客户端?正如您所看到的,手工创建客户端服务合同是危险的

我的困惑是,什么时候 我将客户端代码从“public”更改为 字符串响应“到”公共字符串 responseAliasName”,的值 ResponseAlasName为空。但是什么时候 更改回变量名响应, 响应值是正确的(值 是“hi WCF”)。 我的困惑是,我认为变量名 应该没关系,只要 客户端和客户端的布局相同 服务器端。你知道怎么了吗

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

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

FooResponse someReallyCleverVariableNameWhateverItMightBe = f.Submit("Hi!");
但是数据契约当然是一个共享元素,服务和客户必须达成一致!您不能在本地更改数据协定中元素的名称-毕竟,这才是真正描述如何将调用转换为XML消息的内容,这些比特和片段必须在服务器和客户机之间保持同步,以便客户机能够将从服务器接收到的消息转换回供您使用的对象

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

马克

我的困惑是,什么时候 我将客户端代码从“public”更改为 字符串响应“到”公共字符串 responseAliasName”,的值 ResponseAlasName为空。但是什么时候 更改回变量名响应, 响应值是正确的(值 是“hi WCF”)。 我的困惑是,我认为变量名 应该没关系,只要 客户端和客户端的布局相同 服务器端。你知道怎么了吗

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

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

FooResponse someReallyCleverVariableNameWhateverItMightBe = f.Submit("Hi!");
但是数据契约当然是一个共享元素,服务和客户必须达成一致!您不能在本地更改数据协定中元素的名称-毕竟,这才是真正描述如何将调用转换为XML消息的内容,这些比特和片段必须在服务器和客户机之间保持同步,以便客户机能够将从服务器接收到的消息转换回供您使用的对象

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


Marc

我见过一些场景,特别是在处理REST WCF时,依赖svcuti创建契约是个坏主意。我见过一些场景,特别是在处理REST WCF时,依赖svcuti创建契约是个坏主意。