WCF 使用WSDUALBINDING实现双工通信,寄宿服务器IIS,但是局域网内的客户端执行方法的时候发生超时

linzhuohao213 2014-09-10 04:09:00
WCF 使用WSDUALBINDING实现双工通信,寄宿服务器IIS,但是局域网内的客户端执行方法的时候不能够执行,发生超时,但是关闭防火墙后就可以执行

服务器端:

[ServiceContract(SessionMode=SessionMode.Required ,CallbackContract=typeof(IEHAOYAOCallback))]
public interface IEHAOYAOMessageService
{
[OperationContract(IsOneWay = false, IsInitiating = true, IsTerminating = false)]
string Join(string agentId);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void Leave();
[OperationContract(IsOneWay = false,IsInitiating = false, IsTerminating = false)]
string ClearWait();
[OperationContract(IsOneWay = false, IsInitiating = false, IsTerminating = false)]
string CloseSeesion(string customerOpenID);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void GetWaitCustomer();
[OperationContract(IsOneWay = false, IsInitiating = false, IsTerminating = false)]
string UpdateStatus(int status);


}

public interface IEHAOYAOCallback
{
[OperationContract(IsOneWay = true)]
void ReceiveTextMessage(TextEntity messageEntity);
[OperationContract(IsOneWay=true)]
void ReceiveImageMessage(ImageEntity messageEntity);
[OperationContract(IsOneWay = true)]
void ReceiveVoiceMessage(VoiceEntity messageEntity);
}

配置文件:

<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/></system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<!--为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点-->
<serviceMetadata httpGetEnabled="true"/>
<!--要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息-->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="WCFService.EHAOYAOMessageService">
<endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="myBindingNone" contract="WCFService.IEHAOYAOMessageService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<wsDualHttpBinding>
<binding name="myBindingNone" sendTimeout="00:04:00">
<security mode="None">
</security>
</binding>
</wsDualHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>


客户端:

private void Form1_Load(object sender, EventArgs e)
{
client = new EHAOYAOMessageServiceClient(new System.ServiceModel.InstanceContext(this));
}

private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show(client.Join(txtAgent.Text));
}


...全文
274 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
E次奥 2014-09-11
  • 打赏
  • 举报
回复
可以在防火墙开放端口
E次奥 2014-09-11
  • 打赏
  • 举报
回复
防火墙把端口禁止了,所以找不到地址,连接失败; 可以在防火墙开发端口
linzhuohao213 2014-09-11
  • 打赏
  • 举报
回复
问Forty2: 我之前看《WCF服务编程》那本书,书上说WSDUALHTTPBINDING 的原理就是创建两条通道来实现双工通信的,这跟你说不是一个意思吗,为什么要开放防火墙才能够正常使用
mjp1234airen4385 2014-09-11
  • 打赏
  • 举报
回复
还是防火墙的问题啊。 如果从socket做起就好了。
Forty2 2014-09-10
  • 打赏
  • 举报
回复
选项: * 关防火墙 * 改为nettcp binding(可以双工) * 改为HttpBinding(不能双工) * 还是用HttpBinding,但另外用一个长连接来自己实现双工。
於黾 2014-09-10
  • 打赏
  • 举报
回复
客户端对服务端的2个端口分别建立连接,一个负责发,一个负责收,双线程工作,这不就是双工了么
linzhuohao213 2014-09-10
  • 打赏
  • 举报
回复
我不可能主动的关闭防火墙吧
linzhuohao213 2014-09-10
  • 打赏
  • 举报
回复
那该怎么办呢一楼
Forty2 2014-09-10
  • 打赏
  • 举报
回复
WSDUALBINDING实际上通过两个连接来实现双工。一个是客户连接到服务端,一个是服务端连接到客户。 客户连接到服务端一般不会有问题,因为防火墙一般允许从局域网内主动发起的连接(否则你就不能上网)。 但是,防火墙一般会阻断外面世界主动发起的连接,也就是服务端不能直接连接到客户。 少了一个连接,你的双工通讯就不能建立。

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧