我有一个有两个端点的WCF服务.一个使用basicHttpBinding,另一个使用netTcpBinding.这是我的配置......
<services>
<service name="SomeService.Service">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration=""
name="EndPointHttp" contract="SomeService.IService" />
<endpoint address="" binding="netTcpBinding" bindingConfiguration=""
name="EndPointTcp" contract="SomeService.IService" />
</service>
</services>
Run Code Online (Sandbox Code Playgroud)
但是,当我使用该服务时,我试图比较两个请求之间的差异.所以我正在运行小提琴手去做这件事.我可以在Fiddler中看到basicHttpBinding请求,但我无法显示net.tcp://请求.我该怎么做才能看到这种流量?
在你将问题读到最后之前,请不要关闭.我已经谷歌搜索了几个小时没有成功.
编辑:现在我确信它与WCF缓存打开TCP连接(连接池)的方式有关.请在问题结尾处查看编辑#5.
我基本上有一个使用netTcpBinding配置的WCF服务.即使我正常关闭客户端代理(请参阅下面的代码),服务器也始终记录" System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host".
我已经将问题缩小到我能写的最基本的WCF示例.我每次关闭客户端应用程序时都会在WCF跟踪生成的日志中获得异常.我在自己的代码中没有得到任何异常,这意味着它按预期工作,我无法调试任何东西,看看WCF在我的日志中添加错误出了什么问题.
服务接口/实现:
[ServiceContract]
public interface IService1
{
[OperationContract]
string DoWork();
}
...
public class Service1 : IService1
{
public string DoWork()
{
return "12";
}
}
Run Code Online (Sandbox Code Playgroud)
服务器端配置:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service name="WebApplication1.Service1">
<endpoint …Run Code Online (Sandbox Code Playgroud) 我有一个机器控制应用程序,我有一台客户端计算机和五个服务器盒在机器子网上进行通信.没有域控制器.我想使用netTcpBinding来提供可靠性和事务支持.
当域控制器不存在时,是否可以使用此绑定进行用户名/密码验证?我不想使用证书,因为我不想管理900台计算机(150台机器)上的证书,这些计算机不会连接到办公室局域网.
在.Net中找到下一个TCP端口,说明如何在原始.net中执行此操作,但不知道如何使用WCF安全地执行此操作.
在我的单元测试中,我需要使用NetTcpBinding,我不希望硬编码它正在使用的端口.
因此,如何在我的ServiceHost中使用NetTcpBinding时自动选择一个空闲端口?
我怎样才能告诉我它选择的端口(或完整端点地址)?
或者我如何使用.NET找到一些对服务器有效的端口?
鉴于我的赏金没有带来任何新答案,我认为我们可以假设没有好的答案.
我只是在学习围绕WCF的绳索.我打算做的是使用NetTcpBinding在客户端和服务器之间打开双工通道,并使其无限期保持打开状态,以便服务器可以向客户端发起请求.
然后我偶然发现了Jesse Ezell撰写的这篇博客,这似乎表明保持渠道无限期开放是一件坏事,因为你无法发现错误,这会造成各种不稳定因素.
那是对的吗?如果我使用NetTcpBinding并在关系的任何一侧保持对开放通道的引用,那么如果通信失败会发生什么?我如何捕捉失败事件?还有其他什么问题?您使用的.NET框架有什么区别吗?(我在4.0.)
我有一个WCF服务,使用netTcpBinding的单个端点公开,它位于服务器A上,托管在我们域上的内部LAN上的IIS7.5/WAS上.
然后,此服务由位于服务器B上的ASP.NET Web客户端应用程序使用,该应用程序也在IIS7.5上托管,在我们的域外部具有外部托管提供商,并通过VPN连接到我们的LAN,仅允许服务器A之间的流量和服务器B.
在开发期间,当我测试这个概念时,我在我们域内的另一个IIS服务器上运行了Web客户端应用程序,使用绑定安全性mode="Transport"和传输clientCredentialType="Windows"工作正常.
然后我将Web客户端应用程序移动到外部服务器B,以进一步进行概念验证测试,设置绑定安全性mode="None",显然这个服务器在我们的域之外,我不能使用Windows身份验证,它仍然可以正常工作.
我现在需要做的是,启用切换回使用传输安全性是设置clientCredentialType="Certificate",因为你不能拥有传输安全性clientCredentialType="None".
这就是我开始失败的地方.我似乎围绕web.config着服务和客户端web.config在哪里定义证书以及在哪里存储证书的哪些部分.
基本上我要做的是验证服务器B确实是服务器B调用服务器A上的服务,从而防止任何欺骗或DNS颠覆问题,这可能导致服务器A上的服务被非法访问.
我的想法是我需要为服务器B创建一个证书,服务器A持有公钥来验证它?如果是这种情况,则服务器B已经安装了通配符SSL证书,因为它为我们的子域提供了各种应用程序.此证书可以用于WCF身份验证吗?
我发现的SO问题似乎都没有涵盖这一点,我发现的所有各种网站和书籍例子都不是那么清楚.它起初看起来像WCF配置有点像黑色艺术.
这都是使用.NET 4和Visual Basic构建的.任何帮助将不胜感激.
我正在实现一个WCF服务,将在私有LAN中使用(部分).
我将使用netTcpBinding并希望在通信上实现某种形式的安全性,更具体地说,重要的是加密数据以便(例如)没有人可以查看通过网络传输的数据.
我不认为Windows身份验证是合适的,因为最终用户可能无法严格维护其Windows登录和角色以将其用作身份验证.我认为这会使它不恰当吗?如果我错了,请纠正我.
我的问题是,使用netTcpBinding在WCF服务中实现加密的最简单方法是什么?特别是当Windows凭据类型不可用时.
我已经尝试过使用证书进行试验(使用makecert生成我自己的证书)但是明显缺乏教程和文档,描述了如何使用TCP从头到尾完成此操作并在IIS之外的其他东西中托管服务.他们中的很多人都会详细介绍如何生成证书(并且这些教程中没有两个在这方面完全相同)并通过说出类似的内容来完成
使用这些来签署服务和客户端
......不幸的是,这是我需要进一步澄清的过程!
一般来说,证书解决方案似乎超过顶部,而且只是为了实现加密数据而有点过分!
在我可能做出的任何假设中的任何帮助或更正都将非常感激.
我是全新的,并尝试使用net.tcp绑定托管最简单的WCF服务我有Windows 7 Professional和IIS7并启用了NON http激活.
Web.config看起来像这样(未触动)
<system.serviceModel>
<services>
<service name="WcfService2.Service1" behaviorConfiguration="WcfService2.Service1Behavior">
<endpoint address="" binding="wsHttpBinding" contract="WcfService2.IService1">
<!--
Upon deployment, the following identity element should be removed or replaced to reflect the
identity under which the deployed service runs. If removed, WCF will infer an appropriate identity
automatically.
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WcfService2.Service1Behavior">
<!-- To avoid disclosing metadata information, set the value below to false and remove …Run Code Online (Sandbox Code Playgroud) 我在我的客户端 - 服务器应用程序中使用WCF服务,我在服务器和客户端之间的通信时遇到跟随错误.
Error Message =>> System.ServiceModel.CommunicationObjectAbortedException: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it has been Aborted.
Server stack trace:
at System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen()
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at ServiceLib.ServiceCallbackInterfaces.IHostServiceCallback.SendEventAndStatus(String message, Boolean isBackupGenerated)
at ServiceLib.Services.DriversService.objDriver_EventReceived(Object sender, EventReceivedEventArgs e)
Run Code Online (Sandbox Code Playgroud)
应用场景:客户端通过WCF服务从服务器获取数据并使用nettcp绑定.服务器与真实设备连接,每秒生成20-30个事件.使用WCF的回调接口将生成的事件作为字符串消息推送到所有连接的客户端.如果客户端没有任何进程负载(只接收事件和显示),它工作正常.但是当我们在客户端进行一些加载过程并且忙碌一段时间时,它会出错.
注意:我已经在nettcp绑定中设置了最大所有超时,如下所示,但仍然没有解决问题.
NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ZeroMQ重新编写一个旧服务器,现在我有以下服务器设置(适用于Zmq请求):
using (var context = ZmqContext.Create())
using (var server = context.CreateSocket(SocketType.REP)) {
server.Bind("tcp://x.x.x.x:5705");
while (true) { ... }
Run Code Online (Sandbox Code Playgroud)
如果我使用Zmq客户端库进行连接,这种设置可以正常工作 context.CreateSocket(SocketType.REQ)
但不幸的是,我们有很多需要连接到这个服务器的遗留代码,而套接字是使用.net socket libs创建的:
Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Socket.Connect(ipAddress, port);
Run Code Online (Sandbox Code Playgroud)
有没有办法编写ZeroMQ服务器来接受这些传统的.net套接字连接?
nettcpbinding ×10
wcf ×9
c# ×5
tcp ×4
.net ×2
.net-4.0 ×2
credentials ×1
fiddler ×1
security ×1
sockets ×1
unit-testing ×1
zeromq ×1