Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
进行第一次WCF服务调用时出错_Wcf_Wcf Client - Fatal编程技术网

进行第一次WCF服务调用时出错

进行第一次WCF服务调用时出错,wcf,wcf-client,Wcf,Wcf Client,我正在用Java为ServiceWritern编写WCF客户端,由合作伙伴之一编写。当我给他们的服务打第一个服务电话时,我遇到了一个异常。但随后的请求并没有引发任何异常。我正在使用控制台应用程序来测试这一点。为什么第一次失败而不是其他时候 下面是我如何多次调用该服务的代码 for (int i = 0; i < 3; i++) { ServiceClientTest(); } 以下是第一个请求的异常详细信息 未能为CompanyYZ ServiceCompany System.Se

我正在用Java为ServiceWritern编写WCF客户端,由合作伙伴之一编写。当我给他们的服务打第一个服务电话时,我遇到了一个异常。但随后的请求并没有引发任何异常。我正在使用控制台应用程序来测试这一点。为什么第一次失败而不是其他时候

下面是我如何多次调用该服务的代码

for (int i = 0; i < 3; i++)
{
   ServiceClientTest();
}
以下是第一个请求的异常详细信息

未能为CompanyYZ ServiceCompany System.ServiceModel.CommunicationException评分:接收对的HTTP响应时出错。这可能是由于服务端点绑定未使用HTTP协议造成的。这也可能是由于服务器中止了HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。-->System.Net.WebException:基础连接已关闭:接收时发生意外错误。-->System.IO.IOException:无法从传输连接读取数据:已建立的连接被主机中的软件中止。-->System.Net.Sockets.SocketException:主机中的软件中止了已建立的连接 位于System.Net.Sockets.NetworkStream.Read(字节[]缓冲区,Int32偏移量,Int32大小) ---内部异常堆栈跟踪的结束--- 位于System.Net.ConnectStream.Read(字节[]缓冲区,Int32偏移量,Int32大小) 在System.Net.HttpWebRequest.MakeMemoryStream(流) ---内部异常堆栈跟踪的结束--- 在System.Net.HttpWebRequest.GetResponse()中 位于System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan超时) ---内部异常堆栈跟踪的结束---

服务器堆栈跟踪: 位于System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException WebException、HttpWebRequest请求、HttpBortreason abortReason) 位于System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan超时) 位于System.ServiceModel.Channels.RequestChannel.Request(消息消息,TimeSpan超时) 位于System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息消息,TimeSpan超时) 在System.ServiceModel.Channels.ServiceChannel.Call(字符串操作、布尔单向、ProxyOperationRuntime操作、对象[]输入、对象[]输出、时间跨度超时) 位于System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage方法调用,ProxyOperationRuntime操作) 位于System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage消息)

在[0]处重试异常: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) at System.Runtime.Remoting.proxy.RealProxy.PrivateInvoke(MessageData&msgData,Int32类型) 在MyCompany.Services.Clients.serviceCompanyAdapter.process(processRequest)中 在C:\Projects\MyCompany\MyCompany.Distribution\CustomDeliveryProcessor\Clients\XYZCompanyServiceClient.cs中的mycompanyAdapter.process(processRequest请求)中的MyCompany.Services.Clients.XYZCompanyAdapter.MyCompany.Services.Clients.Clients.XYZCompanyAdapter 在C:\Projects\MyCompany\MyCompany.Distribution\CustomDeliveryProcessor\Clients\XYZCompanyServiceClient.cs中的MyCompany.Services.Clients.ServiceCompany.XYZCompanyAdapterClient.process(process process1)中:第1129行
在C:\Projects\MyCompany\MyCompany.Distribution\CustomDeliveryProcessor\CusomerDelivery.cs中的CustomDeliveryProcessor.CusomerDelivery.companyTest()中:第131行

我通过将KeepAlive属性设置为false修复了此错误。我发现的情况是,当第一个请求发送到服务端点时,服务器收到401响应(这是obivous,因为服务使用基本身份验证,然后客户端在下一个请求中发送基本授权头),关闭了连接。客户端端点的默认行为是保持连接处于活动状态。虽然连接已关闭,但客户端仍然使用服务器已关闭的连接发送下一个请求,该连接导致上述问题中的错误。但对于后续请求,此错误不会再次发生,因为客户端在第一个请求本身中发送带有授权标头的请求。因此,401计划不可能得到回应。我所做的是修复将Keep alive属性设置为false的问题。这样,在401响应之后,客户端使用新连接而不是旧连接发送另一个请求。这是代码

Binding binding = null;
        var transportElement = new HttpsTransportBindingElement
                                {
                                    AuthenticationScheme = AuthenticationSchemes.Basic,
                                    KeepAliveEnabled = false,
                                };

        var messegeElement = new TextMessageEncodingBindingElement
        {
            MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap11, AddressingVersion.None),
            ReaderQuotas =
            {
                MaxArrayLength = 200000,
                MaxBytesPerRead = 200000,
                MaxDepth = 200000,
                MaxNameTableCharCount = 200000,
                MaxStringContentLength = 200000
            }
        };
        binding = new CustomBinding(messegeElement, transportElement);

        return binding;

对于每个客户端计算机的第一次调用都会发生这种情况吗?还是web服务器重启后的第一次调用?可能客户端连接超时,因为web服务器尚未启动web服务。
Binding binding = null;
        var transportElement = new HttpsTransportBindingElement
                                {
                                    AuthenticationScheme = AuthenticationSchemes.Basic,
                                    KeepAliveEnabled = false,
                                };

        var messegeElement = new TextMessageEncodingBindingElement
        {
            MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap11, AddressingVersion.None),
            ReaderQuotas =
            {
                MaxArrayLength = 200000,
                MaxBytesPerRead = 200000,
                MaxDepth = 200000,
                MaxNameTableCharCount = 200000,
                MaxStringContentLength = 200000
            }
        };
        binding = new CustomBinding(messegeElement, transportElement);

        return binding;