1

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

有关我正在尝试做的基本示例,请参阅此问题:

用于在不同端点上实现多个合同的服务类的 WCF 配置

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

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

这是我如何在我的 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() 之类的方法或类似的方法。我真的想将游戏客户端拥有的方法和回调与匹配服务或服务器管理员拥有的方法和回调分开。

我也希望它们是单独的合同,只是为了更容易阅读和维护。

但是,如果有更好的方法可以做到这一点,我愿意接受建议。

4

1 回答 1

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);
}

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

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

幸运的是,我不会有同名的回调,但我被困了一段时间,因为我刚刚设置了一些虚拟方法来让事情顺利进行。

于 2012-12-22T16:27:19.010 回答