为什么我不能在Visual Studio中创建服务引用?

时间:2014-04-21 07:31:19

标签: c# .net wcf visual-studio visual-studio-2012

我在一个控制台应用程序中托管了几个WCF服务。所有这些都在代码中配置为使用绑定的NetTcpBinding.TransferMode = TransferMode.Streamed 消息合同用于定义其操作(有关详细信息,请参阅下面的代码)

  • RequestMsgContract1,
  • ResponseMsgContract1,
  • ResponseMsgContract2

出于某种神秘的原因,我无法为使用的服务创建服务引用 ResponseMsgContract1和ResponceMsgContract2消息同时收缩(请参阅下面的IMyService1 defenition)。我收到的消息是

  

无法识别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 Framework Version 4.5.50709
  • Windows 8 Pro

1 个答案:

答案 0 :(得分:0)

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

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

  1. 如果我将ResponceMsgContract2.Length重命名为,则错误消失 ResponceMsgContract2.Length2ResponceMsgContract2ResponseMsgContract1 [ServiceContract] interface IMyService1_1 { [OperationContract] ResponseMsgContract1 Operation1(RequestMsgContract1 arguments); } [ServiceContract] interface IMyService1_2 { [OperationContract] ResponceMsgContract2 Operation2(); } 没有具有相同名称的邮件标头。 为什么这对我来说仍然是个谜。也许是它的WCF错误。

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

    {{1}}
  3. 这两种变体都不是很好的解决方案,并且可能存在无法应用任何变体的情况。但至少它是什么。