Silverlight WCF 超时

Posted

技术标签:

【中文标题】Silverlight WCF 超时【英文标题】:Silverlight WCF Timeout 【发布时间】:2017-07-25 21:11:00 【问题描述】:

我们最近切换了代码库,以编程方式设置 WCF 绑定并生成代理。我们不再在 ServiceReferences.clientconfig 中定义配置。从那时起,Silverlight 中的一些长 WCF 调用一直超时,我不知道为什么。我已将绑定中的所有超时设置为 24 小时。我需要一些关于如何诊断问题的建议。

起初我以为问题是客户端超时,因为错误发生在几分钟后,但服务器端的代码仍在继续,最终成功完成。但我现在并不完全确定这一点。我正在查看 Kestrel 日志窗口,并注意到它说请求完成的同时在 Silverlight 中弹出错误,即使操作在服务器端继续。但是,我找不到有关在服务器端设置 OperationTimeout 的任何信息。这是服务器端的绑定:

private static CustomBinding CreateCustomBinding()

    var httpTransportBindingElement = new HttpTransportBindingElement
    
        MaxBufferPoolSize = 2147483647,
        MaxBufferSize = 2147483647,
        MaxReceivedMessageSize = 2147483647
    ;

    var bindingElements = new BindingElementCollection();
    var binaryMessageEncodingBindingElement = new BinaryMessageEncodingBindingElement
    
        MaxReadPoolSize = 2147483647,
        MaxSessionSize = 2147483647,
        MaxWritePoolSize = 2147483647,
        ReaderQuotas = new XmlDictionaryReaderQuotas
        
            MaxDepth = 2147483647,
            MaxStringContentLength = 2147483647,
            MaxArrayLength = 2147483647,
            MaxBytesPerRead = 2147483647,
            MaxNameTableCharCount = 2147483647
        
    ;

    bindingElements.Add(binaryMessageEncodingBindingElement);
    bindingElements.Add(httpTransportBindingElement);

    var binding = new CustomBinding(bindingElements)
    
        Name = "UserNameBinding",
        CloseTimeout = new TimeSpan(24, 0, 0),
        OpenTimeout = new TimeSpan(24, 0, 0),
        ReceiveTimeout = new TimeSpan(24, 0, 0),
        SendTimeout = new TimeSpan(24, 0, 0)
    ;
    return binding;

这里是如何在客户端创建绑定的代码。让我知道我是否缺少任何其他相关的代码。我已调试此代码以确保代理正在获取此绑定设置。

 public static Binding GetWCFBinding(bool isHttps)
    
        var binding = new CustomBinding
        
            CloseTimeout = new TimeSpan(24, 00, 00),
            OpenTimeout = new TimeSpan(24, 00, 00),
            ReceiveTimeout = new TimeSpan(24, 00, 00),
            SendTimeout = new TimeSpan(24, 00, 00)                 
        ;

        var binaryMessageEncodingBindingElement = new BinaryMessageEncodingBindingElement();

        binding.Elements.Add(binaryMessageEncodingBindingElement);

        binding.Elements.Add(isHttps
            ? new HttpsTransportBindingElement()
            
                MaxBufferSize = int.MaxValue,
                MaxReceivedMessageSize = int.MaxValue,
                TransferMode = TransferMode.Buffered
            
            : new HttpTransportBindingElement()
            
                MaxBufferSize = int.MaxValue,
                MaxReceivedMessageSize = int.MaxValue,
                TransferMode = TransferMode.Buffered
            );

        return binding;
    

我也在代理的构造函数中加入了这一行:

InnerChannel.OperationTimeout = new TimeSpan(24, 0, 0);

错误是这种无法描述的错误,当服务器出现问题或客户端超时时总是返回:

模块:Adapt.Presentation.Xivic.CodeGeneration 异常消息:远程服务器返回错误:NotFound。 时间:2017 年 6 月 3 日下午 4:17:55 堆栈跟踪:偏移处的 ThrowForNonSuccess 90 in file:line:column:0:0 HandleNonSuccess at 文件中的偏移量 87:line:column:0:0 GetResult at 文件中的偏移量 30:行:列:0:0 MoveNext 在 文件中的偏移量 525:行:列:0:0 完全异常: System.ServiceModel.CommunicationException:远程服务器返回 错误:未找到。 ---> System.Net.WebException:远程服务器 返回错误:未找到。 ---> System.Net.WebException:远程 服务器返回错误:未找到。在 System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 在 System.Net.Browser.BrowserHttpWebRequest.c__DisplayClassa.b__9(对象 发送状态)在 System.Net.Browser.AsyncHelper.c__DisplayClass4.b__0(对象 sendState) --- 内部异常堆栈跟踪结束 --- at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback 开始方法,对象状态)在 System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult 结果)---内部异常堆栈跟踪结束---在 Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(任务 任务)在 Microsoft.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 Adapt.Presentation.Xivic.CodeGeneration.d__15.MoveNext()

【问题讨论】:

【参考方案1】:

由于您使用的是 Silverlight,这很可能是 DomainService 未找到错误。这是相当常见的问题,并且指向服务器上的错误配置。您应该能够启动 Fiddler 并查看失败的 URL,并将其与服务器端的先前版本进行比较。

只是快速浏览您的绑定,我看不到为您的服务定义的端点。

【讨论】:

以上是关于Silverlight WCF 超时的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Silverlight是啥程序?

●创建silverlight+wcf

WCF(Silverlight)双工 - 不打服务器

SilverLight、WCf 服务、Datetime.Today

跨域 WCF - Silverlight 配置错误 a:ActionNotSupported

WP7 Silverlight出现错误-“”匹配委托没有超载