Tag: #wcf

如何使用内存中持久存储编写WCF服务?

我编写了一个WCF服务,但存储在Service实现中的数据在调用之间不会持续存在,即使存储在静态变量中也是如此。 我能做什么? 服务实现如下: public class Storage : IStorage { protected static object[] _data; #region IStorage Members public void Insert(object[] data) { lock (_data) { _data = _data.Concat(data).ToArray(); } } public object[] SelectAll() { lock (_data) { return (object[])_data.Clone(); } } #endregion } 服务主机是控制台应用程序: static void Main(string[] args) { ServiceHost serviceHost = new ServiceHost(typeof(TimeSpanStorage)); serviceHost.Open(); Console.WriteLine(“Service […]

如何正确关闭客户端代理(远程主机强行关闭现有连接)?

在你将问题读到最后之前,请不要关闭。 我已经谷歌搜索了几个小时没有成功。 编辑:现在我确信它与WCF缓存打开TCP连接(连接池)的方式有关。 请在问题结尾处查看编辑#5。 我基本上有一个使用netTcpBinding配置的WCF服务。 即使我正常关闭客户端代理(请参阅下面的代码),服务器始终记录“ System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host ”。 我已经将问题缩小到我能写的最基本的WCF示例。 我每次关闭客户端应用程序时都会在WCF跟踪生成的日志中获得exception。 我在自己的代码中没有得到任何exception,这意味着它按预期工作,我无法调试任何东西,看看WCF在我的日志中添加错误出了什么问题。 服务接口/实现: [ServiceContract] public interface IService1 { [OperationContract] string DoWork(); } … public class Service1 : IService1 { public string DoWork() { return “12”; } } 服务器端配置: 客户端配置: 使用该服务的客户端代码(VS2012使用“添加服务引用”为我生成了客户端代理): private async Task TestTask() { […]

是否可以使WcfTestClient适用于自定义传输通道?

目标 我希望能够通过WCF在我正在设计的托管框架内托管并连接到vanilla套接字服务器。 我希望能够使用WCF来编码今天必须由套接字程序员手动管理的传输和协议通信。 这将使我能够与Linux服务器守护进程实现最终的互操作性,除了传统的套接字和专有协议之外,它们只能暴露出来。 我只对此时通常使用WcfTestClientvalidation传输通道层感兴趣。 我的理解是WcfTestClient不支持复杂的服务方法。 有人认为可以使WcfTestClient适用于自定义传输通道吗? 能够通常使用此客户端来测试任意数量的自定义传输通道将是非常好的。 概观 我正在努力了解Windows SDK中包含的WCF Udp示例,该示例通常位于C:\ Program Files \ Microsoft SDKs \ Windows \ v6.1 \ Samples \ WCFSamples \ TechnologySamples \ Extensibility \ Transport \ Udp \ CS,假设WCFSamples.zip文件是从Samples目录中完全提取的。 这些是我到目前为止采取的步骤: (成功):在Visual Studio 2008中成功运行解决方案的服务和客户端。 (成功):使用通常位于C:\ Program Files \ Microsoft Visual Studio 9.0 \ Common7 \ IDE的WcfTestClient连接到MEX端点 (失败):使用WcfTestClient尝试从ICalculatorContract或IDatagramContract服务合同执行方法。 例如,当我执行Hello()方法时,收到以下错误: 友情致辞: 无法调用该服务。 […]

如何在当前上下文中访问WCF服务实例?

如果我在特定服务实例和操作的上下文中执行,如何访问当前正在执行的服务实例? 服务实例不从任何特定的公共基类或接口inheritance,并且我可以找到进入现有上下文的唯一途径: OperationContext.Current 但我似乎无法找到引用实际服务实例本身的任何属性,以便我可以将其转换为我应该知道的并对其执行操作。 如果没有探究我为什么这样做(这是无关紧要的),请告诉我是否有任何方法可以找到我想要的参考。 编辑: [ServiceContract] public interface IInventory { [OperationContract] List ListDeals(DealQueryOptions options); } // This is the object I will need access to the current instance of public class Inventory : ServiceBase, IInventory { public List ListDeals(DealQueryOptions options) { var obj = new Whatever(); // see below } } public class Whatever […]

将CDATA与WCF REST入门工具包一起使用

我有一个使用WCF REST入门套件的预览2构建的服务,但是我遇到了在调用中传递XML样式数据的问题。 这是我的请求对象: [DataContract(Namespace = “”)] public class ServiceRequest { [DataMember] public string ContentText { get; set; } [DataMember] public string ApiKey { get; set; } } 一切正常,直到你扔进那里。 是否有将ContentText属性封装在CDATA或类似的东西中?

WCF – 让客户检查服务可用性

我有一个客户端 – 服务器系统,双方都是由我编写的,当服务器断开/死机时我想让客户端处于“离线”状态,然后当服务器再次可用时自动将它们“恢复” 。 对于第一部分,我监听通道故障事件并通过将客户端设置为脱机来处理。 然后我开始在服务器上调用“ping”服务(每30秒),如果它还活着,它就会返回一个bool。 一旦它活着,客户端就会获得bool并重新上线。 这一切都有效,我遇到的问题是,当客户端调用ping服务并且服务器关闭时,没有响应(显然),最终,大约2分钟后我得到一个端点未找到exception。 到这个时候,我已经尝试了3-4次ping,因此有3-4个exception酿造。 我的问题是,如何更优雅地处理ping服务? 理想情况下,我想定期拨打一个服务,让我知道它是否在线,并立即让我知道它是否在线。

序列化我的实体时Json.Net意外字符(“\”)

我正在使用优秀的Json.Net库来序列化由entity framework生成的实体。 我使用以下代码来执行此操作: using (MyVoucherEntities context = new MyVoucherEntities()) { List list = context.MyObjects.ToList(); string json = JsonConvert.SerializeObject(list); } 一切顺利我的意思是,对象被正确序列化除了一个人认为:它添加了转义字符“\”,这使得我在客户端进行反序列化时会遇到噩梦。 [ { \”$id\”: \”1\”, \”CreationDate\”: \”\\\/Date(1293186324257+0000)\\\/\”, \”ImageUrl\”: \”http:\/\/www.google.com\”, \”Title\”: \”Here is a title\” } ] 有谁知道为什么以及如何摆脱这些转义字符斜杠“\”?

跟踪日志位置,查看位置

你在哪里看到Trace.Write(“”); 在开发MVC或WCF应用程序时记录日志? 什么是正确的地方?

如何获取WCF服务正在侦听的端口?

我有一个net.tcp WCF服务,我希望操作系统选择它应该监听的端口。 所以我在我的URI中将端口设置为0, netstat确认操作系统已经选择了5000范围内的端口。 如何在服务流程中找到代码中已选择的实际端口? 一些代码显示我尝试过的内容: Type serviceType = …; Uri address = new Uri(“net.tcp://0.0.0.0:0/Service/”); ServiceHost serviceHost = new ServiceHost(serviceType, address); ServiceEndpoint endPoint = serviceHost.AddServiceEndpoint(type, binding, “”); int port1 = endPoint.ListenUri.Port; // returns 0 int port2 = serviceHost.BaseAddresses.First().Port; // also returns 0

WCF – 最快的进程间通信

A具有Web可访问(通过basicHttpBinding)WCF服务,我也希望从同一台机器上的其他.NET服务访问,并尽可能提高性能。 我知道netNamedPipeBinding是理想的,但是想知道什么是最好的配置,我甚至只会与其他.NET进程通信。 例如,我不一定使用像SOAP这样的编码,因为这可能太笨重,而且我不需要与.NET客户端以外的任何其他客户端兼容。 我也认为我不需要任何安全保障。 什么是用于此目的的最佳绑定配置(或任何其他配置)