C# 使用WCF的TimeoutException

C# 使用WCF的TimeoutException,c#,wcf,exception,timeoutexception,C#,Wcf,Exception,Timeoutexception,我在尝试设置我打开的代理/通道内的一些变量时遇到超时异常。 我不确定这是一个坏的数据契约还是我没有正确设置的东西 以下是服务接口: [ServiceContract] public interface ICommandBoardService { [OperationContract] void Hello(); [OperationContract] Command_Board.States getState(); [OperationContrac

我在尝试设置我打开的代理/通道内的一些变量时遇到超时异常。 我不确定这是一个坏的数据契约还是我没有正确设置的东西

以下是服务接口:

[ServiceContract]
public interface ICommandBoardService
{
    [OperationContract]
    void Hello();

    [OperationContract]
    Command_Board.States getState();

    [OperationContract]
    void setState(Command_Board.States s);

    [OperationContract]
    string setConnected(int i);

    [OperationContract]
    int getConnected();

}
以下是服务类别:

public class CommandBoardService : ICommandBoardService
{
    [DataMember]
    public Command_Board.States state;

    [DataMember]
    public int connected = 0;

    public void Hello()
    {
    }

    public Command_Board.States getState()
    {
        return state;
    }

    public void setState(Command_Board.States s)
    {
        state = s;
    }

    public string setConnected(int i){
        connected += i;
        return "Player "+connected+" Connected";
    }

    public int getConnected(){
        return connected;
    }
}
这里是我打开主机并调用代理的地方:

            ICommandBoardService proxy;
            using (ServiceHost host = new ServiceHost(typeof(CommandBoardServiceLibrary.CommandBoardService)))
            {
                host.AddServiceEndpoint(typeof(
                    CommandBoardServiceLibrary.ICommandBoardService),
                    new NetTcpBinding(),
                    "net.tcp://localHost:9000/CommandBoardEndPoint");
                host.Open();


                proxy = ChannelFactory<ICommandBoardService>.CreateChannel(
                             new NetTcpBinding(),
                            new EndpointAddress(
                            "net.tcp://localhost:9000/CommandBoardEndPoint"));

                proxy.setConnected(0);
                proxy.setState(state);
            }
ICommandBoardService代理;
使用(ServiceHost主机=新ServiceHost(类型为(CommandBoardServiceLibrary.CommandBoardService)))
{
host.AddServiceEndpoint(类型)(
CommandBoardServiceLibrary.ICommandBoardService),
新的NetTcpBinding(),
“净。tcp://localHost:9000/CommandBoardEndPoint");
host.Open();
proxy=ChannelFactory.CreateChannel(
新的NetTcpBinding(),
新端点地址(
“净。tcp://localhost:9000/CommandBoardEndPoint"));
proxy.setConnected(0);
代理设置状态(状态);
}
当我到达
proxy.setConnected(0)
时,我会出现以下错误,即使我将它们翻转过来,我也会在
proxy.setState(state)

这就是错误:

此请求操作已发送到网络。tcp://localhost:9000/CommandBoardEndPoint 在配置的超时(00:01:00)内未收到答复。分配给此操作的时间可能是较长超时的一部分。这可能是因为该服务仍在处理该操作,或者因为该服务无法发送回复消息。请考虑增加操作超时(通过将通道/代理转换为ICONTROST通道并设置操作超时属性),并确保服务能够连接到客户端。< /代码> < / P>
我可以做些什么来修复错误?

有些人说要增加最大缓冲区,但我不知道如何使用WinForms做到这一点。

您应该在绑定属性下增加app.config中的maxBufferSize

<binding name="blah"
         maxBufferSize="2147483647" -- Max int size
/>

您正在打开主机并在同一线程上创建代理。如果这样做有效,我会感到惊讶;我看不出主机是如何实际执行任何操作的。客户机将同步等待来自主机的响应——主机永远不会给出响应,因为它只能在客户机正在使用的线程上完成该工作


我认为,解决方案是使用.net中多种不同的多线程方法中的一种,在一个单独的线程中启动主机,这样两者都可以同时工作。

您的代码所做的只是增加一个变量。我不明白为什么要花1分钟才能完成。我假设问题发生在其他地方。启用跟踪并查看跟踪日志中是否有任何内容。@PoweredByOrange,我以前从未启用过跟踪。我应该寻找什么?只需谷歌“如何启用跟踪wcf”。@PoweredByOrange,是的,我正在看一些视频。奇怪的是,当在其他地方使用相同的代码时,我得到了预期的结果。你解决问题了吗?