WCF:自托管NetTcp服务,无法解析

时间:2009-12-10 16:58:13

标签: c# wcf

我正在尝试使用Windows服务中的NetTcpBinding来托管WCF服务。 (我将把它用作Web和Windows32的各种客户端的API)显然,我在将它放入Windows服务之前在测试主机中执行此操作。

我有以下合同:

namespace yyy.xxx.Server.API.WCF
{
    [ServiceContract]
    public interface ISecureSessionBroker
    {
        [OperationContract]
        string GetSessionToken(string username, string encryptedPassword, string clientApiKey, string clientAddress);
    }
}

具有以下实现:

namespace yyy.xxx.Server.API.WCF
{
    public class SecureSessionBroker : ISecureSessionBroker
    {
        #region ~ from ISecureSessionBroker ~

        public string GetSessionToken(string username, string encryptedPassword, string clientApiKey, string clientAddress)
        {
            return Guid.NewGuid().ToString();
        }

        #endregion
    }
}

我使用下面的代码(在类/方法中)托管WCF服务:

try
{
    _secureSessionBrokerHost = new ServiceHost(typeof(SecureSessionBroker));
    NetTcpBinding netTcpBinding = new NetTcpBinding();
    _secureSessionBrokerHost.AddServiceEndpoint(typeof(ISecureSessionBroker), netTcpBinding, "net.tcp://localhost:8080/secureSessionBrokerTcp");
    int newLimit = _secureSessionBrokerHost.IncrementManualFlowControlLimit(100);
    // Open the ServiceHost to start listening for messages.
    _secureSessionBrokerHost.Open();

}
catch (Exception ex)
{
throw;
}

这里的关键是我不想依赖App.config文件。必须以编程方式配置所有内容。当我运行此代码时,该服务似乎“起来”并听取。 (即我没有例外)

但是当我使用下面的客户端代码时:

string secureSessionBrokerUrl = string.Format("{0}/secureSessionBrokerTcp","net.tcp://localhost/8080",url);
EndpointAddress endpointAddress=new EndpointAddress(secureSessionBrokerUrl);
System.ServiceModel.Channels.Binding binding = new NetTcpBinding();
yyy.xxx.Windows.AdminTool.API.WCF.SecureSessions.SecureSessionBrokerClient
    client = new yyy.xxx.Windows.AdminTool.API.WCF.SecureSessions.SecureSessionBrokerClient(binding,endpointAddress);
string sessionToken=client.GetSessionToken("", "", ""); // exception here
MessageBox.Show(sessionToken);

......我总是得到一个例外。目前,我得到了:

  

此请求操作发送到   的net.tcp://本地主机:8080 / secureSessionBrokerTcp   没有得到回复   配置超时(00:01:00)。该   分配给此操作的时间可能   是一段时间的一部分   超时。这可能是因为   服务仍在处理中   操作或因为服务   无法发送回复消息。   请考虑增加   操作超时(通过强制转换   通道/代理到IContextChannel和   设置OperationTimeout属性)   并确保服务能够   连接到客户端。

所以我猜它无法解析服务。

我哪里错了?如何通过TCP测试服务的存在?我使用过SvcTraceViewer,我得到了相同的消息,所以没有消息。

我更愿意向用户询问该服务的URL,因此他们会输入“net.tcp:// localhost:8080”或其他内容,然后将其用作对SecureSessionBroker的各种调用的BaseAddress (和其他)WCF服务......无需借助App.config。

不幸的是,我可以找到的所有示例都使用App.config。

有趣的是,我可以使用VS主机托管服务,并且客户端连接正常。 (使用: D:\ dev2008 \ xxx \ yyy.xxx.Server> WcfSvcHost.exe / service:bin / debug / yyy。 xxx.Server.dll /config:App.config)

1 个答案:

答案 0 :(得分:1)

好的,灵感来自我。

我使用Windows窗体(闹铃)来“托管”该服务。单击表单,我使用了一些代码来点击按钮来调用服务(包括)。当然,服务不在自己的线程中,因此服务无法响应。

我已经通过将Service容器(包含主机)放在自己的线程中来修复它:

Thread thread = new Thread(new ThreadStart(_serviceWrapper.Start));
thread.Start();

Start()方法设置ServiceHost。

我错误地认为,虽然WCF服务主机将为传入请求创建线程,但只有在它自己的非阻塞线程(即不是UI线程)中才会执行此操作。

希望它可以帮助别人。