我在一个控制台应用程序中托管了几个WCF服务。所有这些都在代码中配置为使用绑定的NetTcpBinding.TransferMode = TransferMode.Streamed 消息合同用于定义其操作(有关详细信息,请参阅下面的代码)
出于某种神秘的原因,我无法为使用的服务创建服务引用 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版本
答案 0 :(得分:0)
我不明白为什么我所描述的错误会发生但是 还没有人提供正确的答案,所以我会讲述我想出的解决方法。也许它会对某人有所帮助。
我发现了两种方法可以让Visual Studio创建我需要的服务引用,同时保留我想要的所有操作。
如果我将ResponceMsgContract2.Length
重命名为,则错误消失
ResponceMsgContract2.Length2
以ResponceMsgContract2
和ResponseMsgContract1
[ServiceContract]
interface IMyService1_1
{
[OperationContract]
ResponseMsgContract1 Operation1(RequestMsgContract1 arguments);
}
[ServiceContract]
interface IMyService1_2
{
[OperationContract]
ResponceMsgContract2 Operation2();
}
没有具有相同名称的邮件标头。
为什么这对我来说仍然是个谜。也许是它的WCF错误。
如果我将IMyService1拆分为两个接口,则错误消失:
{{1}}
这两种变体都不是很好的解决方案,并且可能存在无法应用任何变体的情况。但至少它是什么。