-1

我正在做一个 WPF 应用程序,它也是一个 WCF 服务器,我遇到的问题是我需要打开 ServiceHost 并侦听客户端的端口并在它启动后立即接受请求,但我遇到的问题是如果我在函数this.InitializeComponent()之后编写代码以在构造函数中打开主机host.open,则会失败并出现异常。如果我在一个按钮中打开主机并在应用程序启动后按下它,它可以正常工作。

为什么会这样,我该如何解决这个问题?

我正在使用 tcp.net 频道,我将它托管在应用程序中,我收到的异常是关于服务已经注册。

客户端的例外是:

内部异常消息:“现有连接被远程主机强制关闭”
错误号:10054
套接字错误:System.Net.Sockets.SocketError.ConnectionReset

谢谢

沃利

构造函数是:

public Window1()
{
   this.InitializeComponent();
   starthost();  
}

private void starthost()
{
   host = new ServiceHost(typeof (Window1), 
                           new Uri[]{ new Uri("net.tcp://localhost:8000") });

   host.AddServiceEndpoint(typeof(IGanador), new NetTcpBinding(), "Contador");
   host.open(); //it fails with this line here but not in a button 
}
4

3 回答 3

3

那么我得到这个正确吗?您的“Window1”是一个 WPF 窗口类,它实现了服务合同 Iganador?这似乎有点奇怪......创建一个自己的类怎么样,例如“GanadorService”,它实现了IContador?然后将为每个请求创建/实例化这个CLASS - 而不是您的窗口。

public Window1()
{
   this.InitializeComponent();
   starthost();  
}

private void starthost()
{
   host = new ServiceHost(typeof (GanadorService), 
                           new Uri[]{ new Uri("net.tcp://localhost:8000") });

   host.AddServiceEndpoint(typeof(IGanador), new NetTcpBinding(), "Contador");
   host.open(); //it fails with this line here but not in a button 
}


public class GanadorService : IGanador
{
   .... (whatever methods you need) .....
}

这应该会有所帮助,我希望!

马克

于 2009-06-05T20:43:49.230 回答
0


,我解决了这个问题,非常感谢
marc_s 的评论我创建了一个单例服务主机
,将以下属性添加到我的 window1

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

并将其传递给构造函数:

host = new ServiceHost( this , new Uri[]{ new Uri("net.tcp://localhost:8000 });

它工作得很好,因为无论如何我只有一个客户端,

谢谢
这是一篇很棒的文章的链接,其中解释了 WCF 实例管理:

http:/ /msdn.microsoft.com/en-us/magazine/cc163590.aspx

于 2009-06-05T21:14:36.093 回答
0
  1. 使用消息合约类型作为参数时,服务操作中只能使用一个参数

    [OperationContract]
    void SaveEmployeeDetails(EmployeeDetails emp);
    
  2. 服务操作要么应该返回 Messagecontract 类型,要么不应该返回任何值

    [OperationContract]
    EmployeeDetails GetEmployeeDetails();
    
  3. 服务操作将只接受并返回消息合约类型。不允许使用其他数据类型。

    [OperationContract]
    EmployeeDetails ModifyEmployeeDetails(EmployeeDetails emp);
    

注意:如果一个类型同时有消息和数据契约,服务操作将只接受消息契约。

于 2016-06-02T05:22:15.500 回答