我需要通过客户端防火墙使用WCF推送技术.这一定是一个常见的问题,而且我知道它在理论上是有效的(参见下面的链接),但是我没能使它工作,而且我找不到能够演示它的代码示例.
要求:
解决方案似乎是双工netTcpBinding.根据这些信息:
但我还没有找到一个有效的代码示例..我尝试将微软的WCF样本中的"Duplex"和"TcpActivation"样本结合起来,没有任何运气.请有人指出我可以使用的示例代码,或构建一个小样本应用程序.非常感谢!
在使用WCF双工(聊天服务|短信服务)开发迷你项目后,我得到了一个可能不正确的点!!
我认为双相理论是好的和有用的,但使用Wcf Duplex存在很多问题.(如可靠会话,超时例外,客户端地址 - 服务器端管理,客户端代理管理)
我觉得错吗?我想念一下吗?
有关更多信息我使用wsDualHttpBinding而不是tcpBinding.
我有一个Windows服务,记录从雷达枪到数据库的速度读数.另外,我使服务成为WCF服务器.我有一个表单和一个CF客户端订阅该服务,并在有满足某些条件的读数时被回叫.
这原则上有效,但经过一段时间后通道超时.似乎长期连接存在一些基本问题(参见 http://blogs.msdn.com/drnick/archive/2007/11/05/custom-transport-retry-logic.aspx)和双工HTTP回调可能不是正确的解决方案.有没有其他方法可以实现WCF的发布/订阅模式?
编辑:即使超时2小时,频道最终也会受到损害.我收到此错误:
无法完成操作'SignalSpeedData',因为会话通道超时等待接收消息.要增加超时,请在配置文件中的绑定上设置receiveTimeout属性,或者直接在Binding上设置ReceiveTimeout属性.
这发生在最后一次成功通话后15分钟.我想知道如果不是保持会话开放,就可以为每次通话重新建立一个新的会话.
我必须设计并实现一种处理客户端/服务器应用程序中长时间运行的进程的方法.典型的长时间运行过程可能需要2-3分钟.我还需要在此期间向UI报告进度并保持UI响应.
考虑到这些,我想到了一些解决方案:
一个异步请求启动进程,启动服务器端进程并返回已分配的LRPID(长时间运行进程ID),然后使用该LRPID定期从客户端轮询.(专业:部署简单,没有防火墙搞乱Con:不雅,资源消耗等)
使用双工绑定(例如NetTcpBinding)并在进行过程中从服务器启动回调(Pro:优雅,高效,Con:部署噩梦)
[你的建议???]
你对此有何看法?
我不能否认双工异步调用的性能优势,但有些事情让我感到谨慎.
我担心的是,在实例化客户端对象的情况下,WCF能否告诉哪个特定的客户端服务实例将接收回调参数?
谁能告诉我这是不是一个好主意?如果不是为什么不呢?
new DuplexChannelFactory<IServerWithCallback>(
new ClientService(),
new NetTcpBinding(),
new EndpointAddress("net.tcp://localhost:1234/"+Guid.NewGuid()))
Run Code Online (Sandbox Code Playgroud)
如果保留上面的虚拟路径,则如何将其丢弃.我希望客户端服务的生命周期相当短.IE发出请求并收到响应,完成接收后,将其杀死.在使客户端服务生命周期缩短而不是将其集中并使其保持更长时间的性能损失有多糟糕.
这个想法是为了避免超时问题.完成接收,发送,尽快处理.按照惯例 - 无法传递客户服务.如果您需要信息,请创建一个新的,简单的 - 就像EF/L2S等.
从WCF服务本身内部,如何终止与客户端的会话.即.我不希望客户端结束会话 - 我知道我可以相应地修饰我的操作,但我希望服务在满足某些条件时以编程方式终止自身.
我可以相应地粘贴端口并转发以解决任何防火墙问题,但我担心的是客户端是否要坐在负载平衡器后面.服务如何知道要调用哪个特定服务器?
我有一个WCF服务和一个Silverlight 5客户端.我已经定义了以下接口:
[ServiceContract(Namespace = "Silverlight", CallbackContract = typeof(IDuplexClient))]
public interface IDuplexService
{
[OperationContract]
void Subscribe(string userId);
[OperationContract]
void Unsubscribe(string userId);
}
[ServiceContract]
public interface IDuplexClient
{
[OperationContract(IsOneWay = true)]
void PushNotification(string msg);
}
Run Code Online (Sandbox Code Playgroud)
这是我的Web.config文件:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
</configuration>
Run Code Online (Sandbox Code Playgroud)
当我尝试运行服务时,我得到:
由于编译期间发生异常,无法激活服务'/ServerService.svc'.异常消息是:Contract需要Duplex,但Binding'BasicHttpBinding'不支持它,或者没有正确配置以支持它.
我知道我需要为Web.config添加一些属性,但无论我在哪里(以及我尝试过的任何东西)都无法使其工作.
我是WCF的新手,我希望你对这个问题有所帮助.我所有的谷歌搜索引导我无处可回答在这里问同样问题的人的答案对我不起作用.
所以我决定放弃搜索,然后问一下.
更新:我使用此链接创建界面 - http://msdn.microsoft.com/en-us/library/cc645027%28v=vs.95%29.aspx
在最新的几个版本的NodeJS(编写时为v0.10.X)中,Streams API经历了一次欢迎的重新设计,我现在想开始使用它.
我想用一个实现协议的对象包装套接字的输入和输出.
所谓的Duplex接口,似乎只是任何可读写的流(如套接字).
目前尚不清楚双工是否应该像A或B,或者它是否无关紧要.
+---+ +---+
-->| A |--> | |-->
+---+ | B |
| |<--
+---+
Run Code Online (Sandbox Code Playgroud)
具有两个可写和两个可读对象的对象的正确代码结构/接口是什么?
+--------+ +----------+ +----
| r|-->|w r|-->|w
| socket | | protocol | | rest of app
| w|<--|r w|<--|r
+--------+ +----------+ +----
Run Code Online (Sandbox Code Playgroud)
上图中的问题是该protocol对象需要两个单独的read方法和两个write方法.
在我的脑海中,我可以使协议生成"左"和"右"双工对象,或"进入"和"出"双工对象(以不同的方式对其进行切片).
这些都是首选方式,还是有更好的解决方案?
OperationContext.Current.GetCallbackChannel实际上做了什么?它如何识别每个客户?
我在WCF服务中遇到问题.如果有两个以上的用户连接到该服务,那么我从服务发送到客户端的所有"有趣的更改"将转到第二个加入的用户.
例如,如果我通过回调将更改发送到C和D,则A,B,C,D加入服务,它将转到B.
有任何想法吗?
细节:
客户端:ASP.NET Web应用程序
绑定:netTCPBinding
UPDATE1
好的,我找到了问题的原因.我在IIS中托管了asp.net客户端.例如,客户端的URL是http:// url1.如果我在不同的机器中打开页面的多个实例并加入服务,则回调通道始终指向页面的第一个实例(我从不同的机器打开该站点).但如果我在IIS中的不同站点下托管asp.net客户端,则回调通道是唯一的.有什么想法吗?
嗨,在双工模式下运行WCF的服务存在很大问题.它泄漏了内存(不多但每天大约80MB)并且在内存分析器与服务一起运行24小时之后我发现大部分内存都byte[]被引入了相当混乱,但我最常引用的结尾是这样的:
而"root"看起来像这样:

我也看到很多ServiceChannel(大约200个)来自回调频道(我认为).
我很确定我每个连接的客户端只能容纳其中的一个.
总体而言,我的问题似乎与此几乎相同:Silverlight Wcf实现中的内存泄漏,但在服务器端.
我甚至尝试过[MTAThread]这里提到的事情:当客户端超时但是它没有解决问题时,WCF服务泄漏句柄和内存.
我只是不认为问题出在我的代码中,因为我OperationContext.Current.GetCallbackChannel<IServiceConnectorCallback>()在我自己的一个对象中获取它之后将回调通道包装起来并且没有泄漏(对于每个内存中的每个客户端只有一个给定快照) - 确保我在几次重置这些回调,因为通道可能会改变(客户端丢失连接或重新连接)但我没有办法处理旧的引用,所以我只删除它们,GC应该做它的工作在他们.
我确实使用PerCall我的服务,所以我根本没有处理我的代码中的那些对象.
除了每隔几天重新启动一次服务之外,我真的不知道如何处理这个问题 - 我现在不想要解决的问题:(
所以请给我一些帮助/提示 - 非常感谢你!
我试图使用命名管道在同一台机器上的服务器和客户端进程之间进行通信.服务器向客户端发送消息,客户端对其执行某些操作并返回结果,服务器应该得到结果.
这是服务器的代码:
using System;
using System.IO;
using System.IO.Pipes;
class PipeServer
{
static void Main()
{
using (NamedPipeServerStream pipeServer =
new NamedPipeServerStream("testpipe", PipeDirection.InOut))
{
Console.WriteLine("NamedPipeServerStream object created.");
// Wait for a client to connect
Console.Write("Waiting for client connection...");
pipeServer.WaitForConnection();
Console.WriteLine("Client connected.");
try
{
// Read user input and send that to the client process.
using (StreamWriter sw = new StreamWriter(pipeServer))
{
sw.AutoFlush = true;
Console.Write("Enter text: ");
sw.WriteLine(Console.ReadLine());
}
pipeServer.WaitForPipeDrain();
using (StreamReader sr = new StreamReader(pipeServer))
{
// Display the read …Run Code Online (Sandbox Code Playgroud) duplex ×10
wcf ×8
c# ×4
.net ×2
architecture ×1
callback ×1
firewall ×1
memory-leaks ×1
named-pipes ×1
node.js ×1
polling ×1
progress-bar ×1
push ×1
silverlight ×1
sockets ×1
stream ×1
wcf-binding ×1