标签: duplex

使用net tcp的WCF双工服务:"需要Stream Security ......"

我正在编写一项服务,允许用户注册并在事件发生时接收通知.我正在尝试使用netTcpBinding执行此操作,但即使在本地计算机上运行时也会遇到错误.

当我尝试发送通知时,我超时,收到此错误:

http://www.w3.org/2005/08/addressing/anonymous需要Stream Security ,但没有协商安全上下文.这可能是由远程端点从其绑定中丢失StreamSecurityBindingElement引起的.

为了测试我在一个控制台中托管服务,它正在为我打开,我可以看到WSDL并在其上运行svcutil.当我运行客户端时,尝试发送通知是在上面的错误出现时.

主机App.config:

<system.serviceModel>
<services>
  <service name="CompanyName.WebServices.InterventionService.RegistrationService"
           behaviorConfiguration="RegistrationServiceBehavior">
    <endpoint address="http://localhost:8000/CompanyName/Registration"
              binding="wsDualHttpBinding"
              contract="CompanyName.WebServices.InterventionService.Interfaces.IRegistrationService"/>
    <endpoint address="net.tcp://localhost:8001/CompanyName/Registration"
              binding="netTcpBinding"
              contract="CompanyName.WebServices.InterventionService.Interfaces.IRegistrationService"/>
  </service>
  <service name="CompanyName.WebServices.InterventionService.NotificationService"
           behaviorConfiguration="NotificationServiceBehavior">
    <endpoint address="http://localhost:8010/CompanyName/Notification"
              binding="wsDualHttpBinding"
              contract="CompanyName.WebServices.InterventionService.Interfaces.INotificationService"/>
    <endpoint address="net.tcp://localhost:8011/CompanyName/Notification"
              binding="netTcpBinding"
              contract="CompanyName.WebServices.InterventionService.Interfaces.INotificationService"/>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="RegistrationServiceBehavior">
      <serviceMetadata httpGetEnabled="true"
                       httpGetUrl="http://localhost:8000/CompanyName/Registration"/>
    </behavior>
    <behavior name="NotificationServiceBehavior">
      <serviceMetadata httpGetEnabled="true"
                       httpGetUrl="http://localhost:8010/CompanyName/Notification"/>
    </behavior>
    <behavior name="netTcpRegistrationServiceBehavior">
      <serviceMetadata httpGetEnabled="true"
                       httpGetUrl="net.tcp://localhost:8001/CompanyName/Registration"/>
    </behavior>
    <behavior name="netTcpNotificationServiceBehavior">
      <serviceMetadata httpGetEnabled="true"
                       httpGetUrl="net.tcp://localhost:8011/CompanyName/Notification"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
Run Code Online (Sandbox Code Playgroud)

这是客户端App.config:

<system.serviceModel>
<bindings>
  <netTcpBinding>
    <binding name="NetTcpBinding_IRegistrationService">
      <security mode="None">
        <message clientCredentialType="None"/>
        <transport clientCredentialType="None"/>
      </security>
    </binding>
    <binding name="NetTcpBinding_INotificationService">
      <security …
Run Code Online (Sandbox Code Playgroud)

c# wcf web-services duplex

4
推荐指数
1
解决办法
2万
查看次数

双工WCF服务在第11次呼叫时挂起

我有一个双工WCF服务,它在魔法10代理实例化后挂起.客户端上的具体错误是:

"System.TimeoutException:发送到net.tcp:// localhost:8080/RoomService/netTcp的请求操作未在配置的超时(00:00:59.9960000)内收到回复".

服务器上没有任何明显的错误消息.

请注意,这不是标准的,明显的问题,即无法关闭我的代理连接,因为我正在关闭我的代理连接的每个实例,然后再打开下一个:

try
{
    client.Close();
}
catch (CommunicationException)
{
    client.Abort();
}
catch (TimeoutException)
{
    client.Abort();
}
catch (Exception)
{
    client.Abort();
    throw;
}
Run Code Online (Sandbox Code Playgroud)

我已经将我的节流行为设置为500个同步所有内容:

ServiceThrottlingBehavior throttlingBehavior = new ServiceThrottlingBehavior()
{
    MaxConcurrentCalls = 500,
    MaxConcurrentSessions = 500,
    MaxConcurrentInstances = 500
};
Run Code Online (Sandbox Code Playgroud)

我已将我的服务的ConcurrencyMode设置为Multiple,并且我已经为InstanceContextMode尝试了所有三个可能的值.

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
Run Code Online (Sandbox Code Playgroud)

我尝试过自托管服务,并在IIS中托管它,我在每个服务器上得到相同的结果.

我已经尝试过NetTcpBinding,WSDualHttpBinding和PollingDuplexBinding(在Silverlight上),每个都有相同的结果.我无法尝试BasicHttpBinding或WSHttpBinding,因为这是一个双工服务.

在我的代码中有一个地方我正在启动多个线程(同时执行多个回调),但出于故障排除的目的,我已经评论了这一点,并没有产生任何影响.

在客户端上,我尝试过为每个测试使用新代理,并在所有测试中重用相同的代理,但没有任何运气.我已经尝试为每个代理创建一个新的InstanceContext,并在所有代理中重用相同的InstanceContext,再次,没有运气.

无论我做什么,在我的测试工具中执行第10次测试后,下一次调用服务都会挂起.

关于我可能做错什么的任何想法?

wcf duplex

3
推荐指数
1
解决办法
4007
查看次数

如何有效地使用boost asio套接字进行全双工流式传输?

我正在使用boost.asio编写一个性能关键的双向流服务器.
服务器以这种方式工作:

  • 线程A处理并推送要在OUTPUT队列中发送的对象
  • 线程B等待INPUT队列中的对象来处理它们
  • 线程C是一个接受器线程,它接受传入的客户端并为每个客户端创建一个CLIENT类

多个客户端同时运行,每个客户端都有自己的连接套接字,每个客户端必须同时执行两项操作:

  • 等待(条件变量)至少一个对象出现在OUTPUT队列中(这可能需要很长时间)并尽可能快地发送
  • 从套接字获取任何传入对象,并将其放入INPUT队列

此外,性能和多核可扩展性在此应用程序中至关重要.

标准的异步方法在这里失败(发送回调可能会在等待新对象发送时阻止其他回调)和阻塞方法(每个方向使用1个线程)很复杂,我无法弄清楚如何处理其中一个线程出错.

我应该为每个客户端使用2个插槽(一个用于输出,一个用于输入)?或者可能以某种方式在每个套接字上使用两个io_services,在两个不同的线程上进行并发回调支持?

请解释一下你将如何应对这种情况.谢谢.

c++ streaming boost duplex boost-asio

3
推荐指数
1
解决办法
2469
查看次数

使用高级选项打印(纸盘选择,双面打印,装订)

我们有一个管理打印文档的项目.起初我想知道为什么不能在一个地方设置打印选项.例如,可以使用MS Word自动化完成第一页和其他页面的打印机托盘选择:

var doc = _applicationObject.Documents.OpenNoRepairDialog(FileName: ref sourceFile, ReadOnly: ref readOnly,
                                                                 AddToRecentFiles: ref addToRecentFiles,
                                                                 Visible: ref visible);
doc.PageSetup.FirstPageTray = (WdPaperTray) firstPageTrayCode;
doc.PageSetup.OtherPagesTray = (WdPaperTray) otherPagesTrayCode;
_applicationObject.ActivePrinter = printerPath;
doc.Activate();
_applicationObject.PrintOut(Background: ref backgroundPrint, FileName: sourceFile);
doc.Close(ref saveChanges, ref _missing, ref _missing);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,打印机托盘被指定为整数,因为某些打印机没有托盘的标准值(我们遇到了HP的问题 - 这里描述的托盘代码).所以我们首先使用代码检索托盘打印机的内容:

var setting = new PrinterSettings();
setting.PrinterName = myPrinterName;
foreach (PaperSource tray in setting.PaperSources)
{
    Console.WriteLine("\t{0}: #{1}", tray.SourceName, tray.RawKind);
}
Run Code Online (Sandbox Code Playgroud)

这段代码没有任何问题.

但是这里没有办法指定双面打印和装订选项.双面打印可以做到的,使用驱动程序功能OpenPrinter和SetPrinter,就像描述这里的以及和微软推荐此论坛主题. Staple完全不清楚 …

.net printing duplex tray office-automation

3
推荐指数
1
解决办法
1万
查看次数

了解WCF IsOneWay,CalbackContracts和Duplex-我的假设正确吗?

我一直在阅读和尝试WCF,并尝试以简单的方式理解其工作原理。因此,我的问题是对我认为正确的内容进行验证和确认,但我需要确保:在典型的发布-订阅双工服务中。

1:服务合同-这是客户必须与服务建立的通信路径。

2:回调合同-这是与客户端的通信方法。

3:在回调合同上设置IsOneWay = true属性意味着客户端将不会从服务器取回任何东西。

4:在ServiceContract上设置IsOneWay = true意味着服务器将不会从客户端取回任何东西。

5:void返回方法仍会返回答复,如果IsOneWay = true,则可以忽略该答复,如果可以获取错误错误和肥皂信息。^

为了简洁起见,我查看了以下内容,然后查看了Some ^ ?:

了解WCF

使用IsOneWay属性的WCF问题

了解WCF客户端到服务器

https://msdn.microsoft.com/zh-CN/library/system.servicemodel.operationcontractattribute.isoneway(v=vs.110).aspx

c# wcf soap duplex

3
推荐指数
1
解决办法
4566
查看次数

从2个不同的Excel工作表进行前后打印的VBA代码

我有2张Excel表格,即"For Print"和"Sheet 4".我想使用VBA自动从前到后打印纸张.这是我当前的代码,但在打印第一页后需要用户操作.

Sub Rectangle4_Click()

  Dim PageFrom As Integer
  Dim PageTo As Integer
  Dim xAnswer As Integer

   PageFrom = Sheets("INPUT").Range("J2").Value
   PageTo = Sheets("INPUT").Range("L2").Value

   Sheets("For Print").PrintOut From:=PageFrom, To:=PageTo, Copies:=1, 
   Collate:=True

   '--------------------------------------TO PRINT PAGE 2--------------------

   xAnswer = MsgBox("Print Page 2?", vbYesNo + vbQuestion, "Empty Sheet")

   If xAnswer = vbYes Then
   Sheets("Sheet4").PrintOut From:=1, To:=1, Copies:=PageTo, Collate:=True
   End If
End Sub
Run Code Online (Sandbox Code Playgroud)

请帮忙 :(

我需要在不设置打印机属性的情况下打印它.我的老板告诉我有一个控制打印机API的代码.我们的打印机是FujiXerox.

非常感谢.

printing excel vba duplex excel-vba

3
推荐指数
1
解决办法
1777
查看次数

WCF双向HTTP通信绕过防火墙

我想使用WCF启用双向通信,而无需在客户端上打开端口.

我正在开发像P2P应用程序(类似于teamviewer/logmein)的东西,你不需要打开端口进行通信.

如何通过HTTP/HTTPS完成双向通信而无需在客户端中打开端口?

注意:端口80可以在服务器中打开...没有问题.

谢谢

wcf firewall duplex

2
推荐指数
1
解决办法
2774
查看次数

WCF Duplex - 如何查找客户端的回拨URL?

如何从服务(WCF 3.5)中找到双工HTTP绑定的客户端回调URL?

感谢任何帮助..

c# wcf duplex

2
推荐指数
1
解决办法
2184
查看次数

使用WCF(或其他解决方案)实现安全双工通信的最佳方法

我需要允许多个客户端(winforms应用程序)通过Internet(远程位置)连接到服务器,并启动双工通信,有时会发送大量流量.

目前,我们通过netTcpBinding与WCF使用双工通信,使用我们自己的证书在传输层上进行保护.虽然这有效,但我关注的是一些事情:

  • 设置很麻烦 - 我们为每个客户端创建一个证书,以便与服务器进行识别,并且需要在客户端计算机和服务器上为每个客户端注册证书
  • 因为我们在特定端口上使用tcp,所以我们依赖于在客户端打开的那部分,以便它可以通过tcp启动通信.有些客户位置不喜欢这样.
  • 我们需要能够保证理想的交付

作为替代方案,我想知道使用wsDualHttpBinding,使用单个SSL证书来保护它,并让每个客户端发送某种标识符来标识自己.这会解决防火墙问题,并且它会比http而不是tcp足够高效吗?据我所知,如果你使用http(因为http不支持双向通信),WCF将创建2个频道而不是一个 - 所以听起来它可能会导致一些性能问题.

我的问题是,这个解决方案是否更好,还是有其他解决方案(如NServiceBus)可以使这更容易并解决这些问题?

编辑

我已经知道wsDualHttpBinding不适合我,因为:This binding requires that the client has a public URI that provides a callback endpoint for the service.这对我来说是不可能的.

c# wcf duplex nservicebus

2
推荐指数
1
解决办法
1197
查看次数

关于 http/2 的文章中关于双向和全双工的混淆

一些描述 http/2 的文章称赞它是双向和全双工的。

AFAIK 双向意味着通信是双向的,所以双工本质上是双向的,是吗?

双工可以由一个在某些特定点反转的单工流创建(半双工),也可以创建为两个相反的单工流(全双工)。

也许双向是关于如何发起消息交换?在 http/1 中,只有客户端可以通过向服务器发送请求来启动,服务器在其中返回响应。在 http/2 中,服务器可以发送(推送)一些资源而无需明确要求它。但是我们可以Server-sent events在http/1.1中使用(也就是说,在客户端和服务器上都做了一些配置后,如果它愿意,服务器可以推送消息,但它仍然是通过http/1.1协议)。

当您考虑它时,您可能会注意到 http/1 也是双向和全双工的(因为在半双工中流水线是不可能的)。所以从 http/2 的角度来看这里没有变化。

发生变化的是 http/1 要求响应按照请求的确切顺序到达。http/2 通过流和多路复用提升了这一点。

duplex bidirectional http2

2
推荐指数
1
解决办法
3168
查看次数

使用回调时,WCF双工通道将关闭

我的WCF服务使用netTcpBinding,并有一个回调对象.

我需要服务多个并发客户端,并保持会话,所以服务装饰

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple]
Run Code Online (Sandbox Code Playgroud)

为了避免线程死锁,回调类被装饰

[CallbackBehavior(UseSynchronizationContext=false)]
Run Code Online (Sandbox Code Playgroud)

我用来SynchronizationContext在UI线程中执行该方法.

问题是有时候通道关闭没有任何理由(ICommunicationObject.Closing事件被触发).之后,我在任何后续服务调用中都会遇到异常.

查看跟踪文件,最后一条消息是回调调用,但是,永远不会调用回调方法.没有例外.

经过一些调试后,我发现只有在同步操作过程中进行回调调用时才会发生这种情况.步骤如下:

  1. 调用服务方法AIsOneWay=true
  2. 调用服务方法BIsOneWay=false
  3. A调用回调方法,但B仍在执行.

这不应该是一个问题,因为回调有UseSynchronizationContext=false,所以回调调用可以在一个单独的线程中进行.

我无法在更简单的场景中重现问题.在一个简单的项目中执行这些步骤成功执行.

知道可能发生的事情或如何识别问题?

wcf duplex channel callback

1
推荐指数
1
解决办法
4419
查看次数

与TIdTCPServer同时发送和接收

始终建议在的OnExecute事件处理程序中执行所有发送/接收任务TIdTCPServer,但我不理解以下内容:

如何等待输入的特定顺序,同时将一些数据发送到同一客户端?我不需要命令响应序列,但是我需要:

  • 不断发送实时数据
  • 同时接收回已编辑的数据
  • 并接收命令并为其提供响应。

例如,如果我们正在等待CR-LF:

procedure TSocketServer._serverExecute(AContext: TIdContext);
var
  msg: string;
begin
  msg := AContext.Connection.IOHandler.ReadLn();
  //Here we are only if CRLF was detected.
  //How to send while we are waiting?
  _log(msg);
end;
Run Code Online (Sandbox Code Playgroud)

delphi duplex indy tcpserver

1
推荐指数
1
解决办法
154
查看次数