为什么我无法在 Visual Studio 中创建服务引用

本文关键字:创建 服务 引用 Studio Visual 为什么 | 更新日期: 2023-09-27 17:59:13

我在一个控制台应用程序中承载了多个 WCF 服务。所有这些都在代码中配置为将 NetTcpBinding 与绑定一起使用。传输模式 = 传输模式。消息协定用于定义其操作(有关详细信息,请参阅下面的代码(

  • 请求MsgContract1,
  • 响应MsgContract1,
  • 响应MsgContract2

由于某种神秘的原因,我无法为使用ResponseMsgContract1 和 ResponceMsgContract2 消息同时收缩(请参阅下面的 IMyService1 防御(。我得到的消息是

无法识别 URI 前缀。 元数据包含无法解析的引用:"net.tcp://localhost:8890/MyService1/mex"。 元数据包含无法解析的引用:"net.tcp://localhost:8890/MyService1/mex"。 如果服务是在当前解决方案中定义的,请尝试生成解决方案并再次添加服务引用。

创建仅使用 RequestMsgContract1 和 ResponseMsgContract2(请参阅 IMyService2

(或仅使用 RequestMsgContract1、ResponseMsgContract1(请参阅 IMyService3(的其他两个服务的服务引用没有任何问题。

我的

问题是我的消息合同有什么问题,或者我应该在哪里寻找一些线索?

我没有在这里粘贴我的服务配置代码(正如我所说我不使用 xml 配置文件(,因为它适用于三个服务中的两个。我不认为错误的原因在那里,但您可以在此处找到服务主机控制台应用程序的完整代码 http://pastebin.com/1THhc9mU

// Can't create service reference for this service    
[ServiceContract]
interface IMyService1
{
    [OperationContract]
    ResponseMsgContract1 Operation1(RequestMsgContract1 arguments);
    [OperationContract]
    ResponceMsgContract2 Operation2();
}
// No problems with service reference creation for this one
[ServiceContract]
interface IMyService2
{
    [OperationContract]
    ResponceMsgContract2 Operation1();
    [OperationContract]
    ResponceMsgContract2 Operation2(RequestMsgContract1 arguments);
}
// No problems with service reference creation for this one
[ServiceContract]
interface IMyService3
{
    [OperationContract]
    ResponseMsgContract1 Operation1();
    [OperationContract]
    ResponseMsgContract1 Operation2(RequestMsgContract1 arguments);
}

他们使用这三个消息协定

[Serializable]
[MessageContract]
public class RequestMsgContract1
{
    [MessageHeader(MustUnderstand = true)]
    public Guid arg1;
}
[Serializable]
[MessageContract]
public class ResponseMsgContract1 : IDisposable
{
    [MessageHeader(MustUnderstand = true)]
    public long Length;
    [MessageBodyMember(Order = 1)]
    public System.IO.Stream stream;
    public void Dispose()
    {
        if (stream != null)
        {
            stream.Close();
            stream = null;
        }
    }
}
[Serializable]
[MessageContract]
public class ResponceMsgContract2 : IDisposable
{
    [MessageHeader(MustUnderstand = true)]
    public int Length { get; set; }
    [MessageHeader(MustUnderstand = true)]
    public string Str1 { get; set; }
    [MessageBodyMember(Order = 1)]
    public System.IO.Stream stream { get; set; }

    public void Dispose()
    {
        if (stream != null)
        {
            stream.Close();
            stream = null;
        }
    }
} 

编辑:如果重现问题很重要,这里是我的Visual Studio,.Net Framework和OS版本

  • Visual Studio 2012 (11.0.61030.00 Update 4(
  • .Net 框架版本 4.5.50709
  • 视窗 8 专业版

为什么我无法在 Visual Studio 中创建服务引用

我不明白为什么会发生我所描述的错误,但是还没有人提供正确的答案,所以我会告诉我想出的解决方法。也许它会帮助某人。

我找到了两种方法,可以让Visual Studio创建我需要的服务引用,同时保留我想要的所有操作。

  1. 如果我ResponceMsgContract2.Length重命名为 ResponceMsgContract2.Length2这样ResponceMsgContract2ResponseMsgContract1没有同名的邮件头。为什么这有帮助对我来说仍然是一个谜。也许是 WCF 错误。

  2. 如果我将IMyService1拆分为两个接口,错误就会消失:

    [ServiceContract]
    interface IMyService1_1
    {
       [OperationContract]
       ResponseMsgContract1 Operation1(RequestMsgContract1 arguments);
    }
    [ServiceContract]
    interface IMyService1_2
    {
       [OperationContract]
       ResponceMsgContract2 Operation2();
    }
    

这两种变体都不是好的解决方案,在某些情况下,您可能无法应用其中任何一个。但至少它是一些东西。