从具有两个合同和端点的服务创建代理

时间:2012-12-21 21:14:21

标签: wcf

我在向app.config添加服务时遇到问题,该服务实现了两个合同,因此需要两个端点。

请参阅此问题,了解我要做的事情的基本示例:

WCF config for a service class implementing multiple contracts on separate endpoints

我真的想在我的客户端中使用服务引用来为我创建和维护代理,但是当我尝试使用具有两个端点的服务时,我在尝试下载时会在详细信息中收到以下错误元数据:

  

元数据包含无法解析的引用

以下是我在wcf服务库中的app.config中如何进行服务设置的示例:

  <service name="MyService">
    <endpoint address="Address1" binding="wsDualHttpBinding" bindingConfiguration=""
      name="Service1" contract="IService1" />
    <endpoint address="Address2" binding="wsDualHttpBinding" bindingConfiguration=""
      name="Service2" contract="IService2" />
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
      name="mex" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyService/" />
      </baseAddresses>
    </host>
  </service>

我觉得我错过了一些简单的事情。当我删除其中一个端点时,一切正常。但如果我有两个端点,它就无法解析元数据。

我尝试删除基地址并使用完整地址,并使用不同的端口,但我尝试过的所有路径都会导致相同的错误。


编辑: 我应该首先澄清为什么我试图这样做。我有一个单件服务,我希望客户能够连接到。但是有些方法我不希望客户有权访问。我认为将管理方法和客户端方法分成两个单独的合同将是一个良好的开端。

更清楚的是,这是一款游戏服务器。我希望能够启动游戏服务器的新实例并向其发送地图和类似的东西。 我不希望游戏玩家能够访问LoadMap()等类似的方法。 我真的想要将游戏客户端所拥有的方法和回调与制作服务或服务器管理员所需的方法和回调分开。

我也希望它们是单独的合同,以便于阅读和维护。

但是,如果有更好的方法,我愿意接受建议。

1 个答案:

答案 0 :(得分:0)

我花了一些时间来弄明白这一点。我撕毁了我的项目,并从头开始重建它,直到它崩溃。

如果您尝试这样做,显然您的回调合约中不能有两个具有相同名称的回调方法。

示例:

public interface IService1Callback
{
    [OperationContract(IsOneWay = true)]
    void GetDataDone();
}

public interface IService2Callback
{
    [OperationContract(IsOneWay = true)]
    void GetDataDone();
}

如果您将这些设置为服务合同上的回调合同,请执行以下操作:

[ServiceContract
(Namespace = "ServiceLib", 
SessionMode = SessionMode.Required, CallbackContract = typeof(IService1Callback))]
public interface IService1
{
    [OperationContract(IsInitiating = true)]
    string GetData(int value);
}

[ServiceContract
(Namespace = "ServiceLib", 
SessionMode = SessionMode.Required, CallbackContract = typeof(IService2Callback))]
public interface IService2
{
    [OperationContract(IsInitiating = true)]
    string GetOtherData(int value);
}

你最终会得到我在原始问题中提到的错误。

我认为这是因为端点无法确定方法来自哪个回调契约,因为它们具有相同的名称,因此元数据无法解析引用。

幸运的是,我不会使用相同名称的回调,但我暂时坚持了一段时间,因为我刚刚设置了一些虚拟方法来实现目标。