我正在使用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;
}
}
}
答案 0 :(得分:2)
你可以使用
[DataContract(Name="ResponseAliasName")]
public string response;
在服务器端,它将按预期工作,默认情况下DataContract使用字段或属性名称来序列化数据,并且服务器找不到正确的数据
答案 1 :(得分:1)
不,成员名称包含在序列化中。如果在客户端更改它,则无法将其反序列化为该成员。
答案 2 :(得分:1)
乔治,为什么不使用“添加服务参考”来创建您的客户?如您所见,手动创建客户端服务合同是危险的。
答案 3 :(得分:1)
我的困惑是什么时候 我改变了客户端代码“public 字符串响应“到”公共字符串 responseAliasName“,的值 responseAliasName为null。但当 改回变量名称响应, 响应值是正确的(值 是“喜WCF”)。 我的困惑是,我认为变量名称 只要是无所谓 布局与客户端相同 服务器端。有什么想法是错的吗?
您在客户端本地使用的变量名称完全不相关 - 服务器对此一无所知。给出客户端的代码片段:
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 必须在两端都是相同的 - 这是基本要求,否则几乎没有任何内容。
马克