WCF(Silverlight)双工 - 不打服务器
Posted
技术标签:
【中文标题】WCF(Silverlight)双工 - 不打服务器【英文标题】:WCF (Silverlight) Duplex - Not hitting server 【发布时间】:2011-01-23 17:52:37 【问题描述】:我在 Vista 和 Windows 7 上使用 VS 2008 SP 1 和 Silverlight 3 工具创建了一个嵌入了 Silverlight 项目的 Web 应用程序。
双工服务代码:
[ServiceContract(Namespace = "cotoco", CallbackContract = typeof(IDuplexClient))]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DuplexServer
private IDuplexClient _client;
private string _message;
private int _messageCounter;
private Timer _timer;
public DuplexServer()
#region IDuplexServer Members
[OperationContract(IsOneWay = true)]
public void SendEcho(string message)
_client = OperationContext.Current.GetCallbackChannel<IDuplexClient>();
_message = message;
_timer = new Timer();
_timer.Interval = 2000;
_timer.Enabled = true;
_timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
_timer.Start();
void _timer_Elapsed(object sender, ElapsedEventArgs e)
_client.ReturnEcho(string.Format("Duplex Echo 0: 1", _messageCounter, _message));
_messageCounter++;
if (_messageCounter > 5)
_timer.Dispose();
#endregion
[ServiceContract]
public interface IDuplexClient
[OperationContract(IsOneWay = true)]
void ReturnEcho(string message);
双工配置部分:
我在客户端应用程序中设置了一个 Duplex 服务,如下所示:
Binding svcBinding;
EndpointAddress svcAddress;
svcBinding = new PollingDuplexHttpBinding() UseTextEncoding = true ;
svcAddress = new EndpointAddress("http://localhost/CTC.Test.WCF.Server/DuplexServer.svc");
_duplex = new DuplexServerClient(svcBinding, svcAddress);
我已经同时使用了 Simplex 服务,并且对 Simplex 服务的调用命中了服务器上设置的断点,我可以单步执行。
对 Duplex 服务的调用不会到达断点,尽管客户端上没有引发错误。如果我使用 Fiddler 检查 HTTP 流量,我可以看到在初始请求之后触发了数百个 202 请求 - 我假设这些是轮询请求。
初始双工请求:
POST http://localhost/CTC.Test.WCF.Server/DuplexServer.svc HTTP/1.1 接受:/ 内容长度:665 内容类型:application/soap+xml;字符集=utf-8 UA-CPU:x86 接受编码:gzip,放气 用户代理:Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.0;(R1 1.6);SLCC1;.NET CLR 2.0.50727;InfoPath.2;.NET CLR 3.5.21022;.NET CLR 3.5.30729;. NET CLR 3.0.30618) 主机:cotocovista4.cotoco.local 连接:保持活动 Pragma: 无缓存
后续双工请求:
POST http://localhost/CTC.Test.WCF.Server/DuplexServer.svc HTTP/1.1 接受:/ 内容长度:588 内容类型:application/soap+xml;字符集=utf-8 UA-CPU:x86 接受编码:gzip,放气 用户代理:Mozilla/4.0(兼容;MSIE 7.0;Windows NT 6.0;(R1 1.6);SLCC1;.NET CLR 2.0.50727;InfoPath.2;.NET CLR 3.5.21022;.NET CLR 3.5.30729;. NET CLR 3.0.30618) 主机:cotocovista4.cotoco.local 连接:保持活动 Pragma: 无缓存
有谁知道为什么会发生这种情况,当它停止抛出连接异常时,我想我终于解决了最后一个问题......
问候
三分
更新:我尝试在以下项目类型中重新创建它:WCF 应用程序、Web 应用程序、Web 项目。我已经成功地实现了使用 WCF 消息作为双工参数的 MS 示例,但我一直在寻找一种使用 WSDL 组装双工 Web 服务的快速方法。
【问题讨论】:
【参考方案1】:所以 - 我终于设法使用以下 Web 配置部分使其正常工作,并相应地调整客户端:
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="pollingDuplex"
type="System.ServiceModel.Configuration.PollingDuplexElement, System.ServiceModel.PollingDuplex"/>
</bindingElementExtensions>
</extensions>
<bindings>
<customBinding>
<binding name="DuplexConfig">
<binaryMessageEncoding/>
<pollingDuplex maxPendingSessions="2147483647" maxPendingMessagesPerSession="2147483647" inactivityTimeout="02:00:00" serverPollTimeout="00:05:00"/>
<httpTransport/>
</binding>
</customBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="CTC.Test.WCF.Server.DuplexServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceThrottling maxConcurrentSessions="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="CTC.Test.WCF.Server.DuplexServiceBehavior" name="CTC.Test.WCF.Server.DuplexService">
<endpoint address="" binding="customBinding" bindingConfiguration="DuplexConfig" contract="CTC.Test.WCF.Server.IDuplexService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
如果有人能解释为什么这有效,但使用 wsDualHttpBinding 没有,那将非常有帮助。 :)
(另外 - 为什么显示在代码块中?:/)
问候
特里斯坦
【讨论】:
问题:另外 - 使用这种方法,它似乎保持一个开放的连接,而不是我使用 wsDualHttpBinding 收到的大量 202 垃圾邮件。它是否正确?这会吸收连接池吗?有没有办法直接使用这个 PollingDuplexBinding 选项?【参考方案2】:你知道调用是否真的通过了,只是没有达到你的断点吗? (您可以通过插入一些其他副作用来测试这一点,例如记录到文本文件或类似的东西。)我问这个是因为我过去遇到过完全相同的问题,WCF 双工服务上的断点托管在 IIS 内没有被击中,即使调用正在进行。我最终不得不切换到自托管服务来解决这个问题。我将此作为错误提交给 MS,他们表示将在 .NET 4.0/VS2010/Silverlight 4.0 时间范围内解决。我会发布链接等,但我现在找不到它们。
我最好的建议是,如果这是您的一个选项,并且如果问题只是断点没有被命中,那么要么迁移到 VS2010,要么迁移到自托管服务。
【讨论】:
我在 DuplexServer 构造函数和所有 Web 方法中都放置了异常,并且预计这会在某处导致严重故障,但无论如何它都会继续进行。虽然我没有做任何追踪。我会调查的。 好的 - 我已经添加了跟踪,它肯定不会被击中。 好的 - 我使用的是 Web 应用程序,并已切换到使用 InstanceContextMode.SingleInstance 的 Web 项目。现在它会命中服务类构造函数一次(其他实例模式不会)。但它仍然没有击中消息成员。 嗯。 . .您是否尝试过摆脱单工服务而只访问双工服务?我曾经对我当前的项目有同样的安排,但它造成了各种困难,所以我把所有的东西都转移到了一个单一的双工服务上,这似乎有帮助。也许值得一试。 是的,我已经删除了单工服务。我还尝试了各种项目——Web 应用程序、Web 项目和 WCF 项目。还是没有成功。以上是关于WCF(Silverlight)双工 - 不打服务器的主要内容,如果未能解决你的问题,请参考以下文章
WCF:OneWay OperationContract 上的异常处理
SilverLight、WCf 服务、Datetime.Today