我正在学习WCF,作为学习的一部分,我发现合同的命名空间应该匹配。我写了一个契约类(客户端和主机都有自己的副本),并使它们的命名空间不匹配,但我的代码仍然有用。我已经为我的合同和主机类以及客户如何调用合同提供了代码。有人可以告诉我哪里错了吗?
客户合同类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
namespace GeoLib.Client.Contracts
{
[ServiceContract]
public interface IMessageContract
{
[OperationContract (Name = "ShowMessage")]
void ShowMsg(string message);
}
}
主办合同类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
namespace GeoLib.WindowsHost.Contracts
{
[ServiceContract]
public interface IMessageContract
{
[OperationContract]
void ShowMessage(string message);
}
}
在客户端调用代码:
private void btnMakeCall_Click(object sender, RoutedEventArgs e)
{
ChannelFactory<IMessageContract> factory = new ChannelFactory<IMessageContract>("");
IMessageContract proxy = factory.CreateChannel();
proxy.ShowMsg(txtMessage.Text);
factory.Close();
}
答案 0 :(得分:1)
Namespace通常为used for versioning,因为它们允许两个具有相同名称的对象存在于不同的名称空间中。
但是,您似乎还没有为您的服务定义命名空间。
定义命名空间就像:
[ServiceContract (Namespace="http://yourcompany.com/MyService/V1")]
public interface IMessageContract
{
...
}
如果您稍后使用新实现引入新版本的服务并将其放在单独的命名空间中,例如:
[ServiceContract (Namespace="http://yourcompany.com/MyService/V2")]
public interface IMessageContract
{
...
}
然后您可以将两个服务分开并让旧客户端调用版本1,将新客户端调用版本2