0

这是该项目的设置。

我有一个 WCF 服务,它以缓冲模式托管在 net.tcp 绑定上,并启用了 ReliableSession。

绑定配置为使用 TransportWithMessageCredential 安全性。该证书是我使用指纹识别的自签名证书。UserNameValidator 是一个自定义验证器,用于测试,从不失败(之前没有失败,但我消除了不确定性)

服务和客户端在同一台机器上,他们都可以访问证书。

问题:

我在尝试使用服务中的方法时收到 Socket Aborted 异常。这是我用来打开与服务的连接的代码。MonitorServiceCallbacks 仅包含满足接口要求的空方法。

 _instanceContext = new InstanceContext(new MonitorServiceCallbacks());
 _serviceInterface = new MonitorCallbackServiceClient(_instanceContext);

 _serviceInterface.ClientCredentials.UserName.UserName = Environment.MachineName;
 _serviceInterface.ClientCredentials.UserName.Password = "myPassword";
 _serviceInterface.Open();

这似乎工作正常,因为 _serviceInterface.State 变量设置为 State.Opened 并且自定义验证器被调用并无异常返回。

但是,如果我尝试使用 _serviceInterface 代理调用方法,则不会在服务上运行任何我可以闯入的代码,并且跟踪日志显示除了 SocketAborted 异常之外没有错误,该异常发生在收到似乎是消息的 1 分钟后方法。

没有内部异常。

我试图用谷歌搜索这个问题,但结果往往是“只要禁用安全性,它就会正常工作”。不幸的是,这是无法做到的。

我对这个问题感到非常困惑,任何帮助将不胜感激。

非常感谢,
埃里斯

4

1 回答 1

0

这实际上是一个序列化错误。

我试图发送到从数据合约继承的服务的对象。所以我试图向服务发送数据合约的强制转换。

WCF 似乎不允许这样做。

我要感谢 John Saunders 提醒我,不仅服务可以启用跟踪。启用客户端跟踪将为我节省大量时间。

我试图做以下事情:

_serviceInterface.Register((MyDataContract)MyParentObject, aVariable, anotherOne);

我需要做的:

MyDataContract tempContract = MyParentObject.CreateMyDataContract();
_serviceInterface.Register(tempContract, aVariable, anotherOne);
/* Note: MyParentObject.CreateMyDataContract() is my own method which creates an instance
of the MyDataContract and copies the relevant information to it */
于 2010-07-29T14:59:46.437 回答