为什么我无法在 Visual Studio 中创建服务引用
本文关键字:创建 服务 引用 Studio Visual 为什么 | 更新日期: 2023-09-27 17:59:13
我在一个控制台应用程序中承载了多个 WCF 服务。所有这些都在代码中配置为将 NetTcpBinding 与绑定一起使用。传输模式 = 传输模式。消息协定用于定义其操作(有关详细信息,请参阅下面的代码(
- 请求MsgContract1,
- 响应MsgContract1,
- 响应MsgContract2
由于某种神秘的原因,我无法为使用ResponseMsgContract1 和 ResponceMsgContract2 消息同时收缩(请参阅下面的 IMyService1 防御(。我得到的消息是
创建仅使用 RequestMsgContract1 和 ResponseMsgContract2(请参阅 IMyService2无法识别 URI 前缀。 元数据包含无法解析的引用:"net.tcp://localhost:8890/MyService1/mex"。 元数据包含无法解析的引用:"net.tcp://localhost:8890/MyService1/mex"。 如果服务是在当前解决方案中定义的,请尝试生成解决方案并再次添加服务引用。
(或仅使用 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创建我需要的服务引用,同时保留我想要的所有操作。
-
如果我
ResponceMsgContract2.Length
重命名为ResponceMsgContract2.Length2
这样ResponceMsgContract2
和ResponseMsgContract1
没有同名的邮件头。为什么这有帮助对我来说仍然是一个谜。也许是 WCF 错误。 -
如果我将IMyService1拆分为两个接口,错误就会消失:
[ServiceContract] interface IMyService1_1 { [OperationContract] ResponseMsgContract1 Operation1(RequestMsgContract1 arguments); } [ServiceContract] interface IMyService1_2 { [OperationContract] ResponceMsgContract2 Operation2(); }
这两种变体都不是好的解决方案,在某些情况下,您可能无法应用其中任何一个。但至少它是一些东西。