我正在编写一项服务,允许用户注册并在事件发生时接收通知.我正在尝试使用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) 我有一个双工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次测试后,下一次调用服务都会挂起.
关于我可能做错什么的任何想法?
我正在使用boost.asio编写一个性能关键的双向流服务器.
服务器以这种方式工作:
多个客户端同时运行,每个客户端都有自己的连接套接字,每个客户端必须同时执行两项操作:
此外,性能和多核可扩展性在此应用程序中至关重要.
标准的异步方法在这里失败(发送回调可能会在等待新对象发送时阻止其他回调)和阻塞方法(每个方向使用1个线程)很复杂,我无法弄清楚如何处理其中一个线程出错.
我应该为每个客户端使用2个插槽(一个用于输出,一个用于输入)?或者可能以某种方式在每个套接字上使用两个io_services,在两个不同的线程上进行并发回调支持?
请解释一下你将如何应对这种情况.谢谢.
我们有一个管理打印文档的项目.起初我想知道为什么不能在一个地方设置打印选项.例如,可以使用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完全不清楚 …
我一直在阅读和尝试WCF,并尝试以简单的方式理解其工作原理。因此,我的问题是对我认为正确的内容进行验证和确认,但我需要确保:在典型的发布-订阅双工服务中。
1:服务合同-这是客户必须与服务建立的通信路径。
2:回调合同-这是与客户端的通信方法。
3:在回调合同上设置IsOneWay = true属性意味着客户端将不会从服务器取回任何东西。
4:在ServiceContract上设置IsOneWay = true意味着服务器将不会从客户端取回任何东西。
5:void返回方法仍会返回答复,如果IsOneWay = true,则可以忽略该答复,如果可以获取错误错误和肥皂信息。^
为了简洁起见,我查看了以下内容,然后查看了Some ^ ?:
我有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.
非常感谢.
我想使用WCF启用双向通信,而无需在客户端上打开端口.
我正在开发像P2P应用程序(类似于teamviewer/logmein)的东西,你不需要打开端口进行通信.
如何通过HTTP/HTTPS完成双向通信而无需在客户端中打开端口?
注意:端口80可以在服务器中打开...没有问题.
谢谢
如何从服务(WCF 3.5)中找到双工HTTP绑定的客户端回调URL?
感谢任何帮助..
我需要允许多个客户端(winforms应用程序)通过Internet(远程位置)连接到服务器,并启动双工通信,有时会发送大量流量.
目前,我们通过netTcpBinding与WCF使用双工通信,使用我们自己的证书在传输层上进行保护.虽然这有效,但我关注的是一些事情:
作为替代方案,我想知道使用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.这对我来说是不可能的.
一些描述 http/2 的文章称赞它是双向和全双工的。
AFAIK 双向意味着通信是双向的,所以双工本质上是双向的,是吗?
双工可以由一个在某些特定点反转的单工流创建(半双工),也可以创建为两个相反的单工流(全双工)。
也许双向是关于如何发起消息交换?在 http/1 中,只有客户端可以通过向服务器发送请求来启动,服务器在其中返回响应。在 http/2 中,服务器可以发送(推送)一些资源而无需明确要求它。但是我们可以Server-sent events在http/1.1中使用(也就是说,在客户端和服务器上都做了一些配置后,如果它愿意,服务器可以推送消息,但它仍然是通过http/1.1协议)。
当您考虑它时,您可能会注意到 http/1 也是双向和全双工的(因为在半双工中流水线是不可能的)。所以从 http/2 的角度来看这里没有变化。
发生变化的是 http/1 要求响应按照请求的确切顺序到达。http/2 通过流和多路复用提升了这一点。
我的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事件被触发).之后,我在任何后续服务调用中都会遇到异常.
查看跟踪文件,最后一条消息是回调调用,但是,永远不会调用回调方法.没有例外.
经过一些调试后,我发现只有在同步操作过程中进行回调调用时才会发生这种情况.步骤如下:
A与IsOneWay=trueB与IsOneWay=falseA调用回调方法,但B仍在执行.这不应该是一个问题,因为回调有UseSynchronizationContext=false,所以回调调用可以在一个单独的线程中进行.
我无法在更简单的场景中重现问题.在一个简单的项目中执行这些步骤成功执行.
知道可能发生的事情或如何识别问题?
始终建议在的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)