我想从WCF服务返回一些JSON。 此服务只是从我的数据库返回一些内容。 我可以得到这些数据。 不过,我关心的是我的JSON格式。 目前,返回的JSON格式如下: {"d":"[{\"Age\":35,\"FirstName\":\"Peyton\",\"LastName\":\"Manning\"},{\"Age\":31,\"FirstName\":\"Drew\",\"LastName\":\"Brees\"},{\"Age\":29,\"FirstName\":\"Tony\",\"LastName\":\"Romo\"}]"} 实际上,我希望我的JSON格式尽可能干净。 我相信(我可能是不正确的),以干净的JSON表示的同样的结果集应该是这样的: [{"Age":35,"FirstName":"Peyton","LastName":"Manning"},{"Age":31,"FirstName":"Drew","LastName":"Brees"},{"Age":29,"FirstName":"Tony","LastName":"Romo"}] 我不知道“d”是从哪里来的。 我也不知道为什么要插入转义字符。 我的实体如下所示: [DataContract] public class Person { [DataMember] public string FirstName { get; set; } [DataMember] public string LastName { get; set; } [DataMember] public int Age { get; set; } public Person(string firstName, string lastName, int age) { this.FirstName = firstName; this.LastName = lastName; […]
在deviseREST API或服务时,是否存在处理安全性(身份validation,授权,身份pipe理)的最佳实践? 在构buildSOAP API时,您将WS-Security作为指导,有关该主题的文献很多。 我find了有关保护REST端点的更less信息。 虽然我了解REST故意没有类似于WS- *的规格,但我希望最佳实践或推荐模式已经出现。 任何有关文件的讨论或链接将非常感激。 如果重要的话,我们将使用WCF和POX / JSON序列化消息来构build使用.NET Framework v3.5构build的REST API / Services。
我有一个WCF服务,我想把它作为RESTfull服务和SOAP服务公开。 任何人都曾经做过这样的事情?
更新: 我一直试图打开WCF追踪,但仍然没有成功…下面是我最新的更新。 我需要获得写入下列位置的权限吗? <system.diagnostics> <trace autoflush="true" /> <sources> <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> <listeners> <add name="sdt" type="System.Diagnostics.XmlWriterTraceListener" initializeData= "@\\myservername\folder1\traces.svclog" /> </listeners> </source> </sources> </system.diagnostics> 我正在使用.NET Framework 3.5。 打开WCF跟踪以进行debugging的步骤是什么?
我喜欢在using块中实例化我的WCF服务客户端,因为它几乎是使用实现IDisposable资源的标准方式: using (var client = new SomeWCFServiceClient()) { //Do something with the client } 但是,正如在这篇MSDN文章中指出的那样,将WCF客户端封装在using块中可能会掩盖导致客户端处于故障状态(如超时或通信问题)的任何错误。 长话短说,在调用Dispose()时,客户端的Close()方法会触发,但会因为处于故障状态而引发错误。 原来的exception然后被第二个exception所掩盖。 不好。 MSDN文章中build议的解决方法是完全避免使用using块,而是实例化客户端并使用它们: try { … client.Close(); } catch (CommunicationException e) { … client.Abort(); } catch (TimeoutException e) { … client.Abort(); } catch (Exception e) { … client.Abort(); throw; } 相比于using块,我认为这是丑陋的。 每当你需要一个客户端时,需要写很多代码。 幸运的是,我发现了一些其他的解决方法,比如IServiceOriented上的这个。 你从以下开始: public delegate void UseServiceDelegate<T>(T proxy); […]
我不能深究这个错误,因为当debugging器被连接时,似乎不会发生。 下面是代码。 这是Windows服务中的WCF服务器。 每当有数据事件时,服务就会调用NotifySubscribers方法(以随机间隔,但不常见 – 每天约800次)。 当Windows Forms客户端订阅时,订阅者ID被添加到订阅者字典中,并且当客户端取消订阅时,它从字典中被删除。 错误发生在(或之后)客户端取消订阅。 看起来下一次调用NotifySubscribers()方法时,foreach()循环将失败,并在主题行中发生错误。 该方法将错误写入应用程序日志中,如下面的代码所示。 当一个debugging器被连接并且客户端取消订阅时,代码执行正常。 你看到这个代码有问题吗? 我需要使字典线程安全吗? [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] public class SubscriptionServer : ISubscriptionServer { private static IDictionary<Guid, Subscriber> subscribers; public SubscriptionServer() { subscribers = new Dictionary<Guid, Subscriber>(); } public void NotifySubscribers(DataRecord sr) { foreach(Subscriber s in subscribers.Values) { try { s.Callback.SignalData(sr); } catch (Exception e) { DCS.WriteToApplicationLog(e.Message, System.Diagnostics.EventLogEntryType.Error); […]
我想将值传递给实现我的服务的类的构造函数。 然而,ServiceHost只允许我传入要创建的类型的名称,而不是传递给它的控制器的参数。 我希望能够通过一个创建我的服务对象的工厂。 到目前为止我发现的是: WCF依赖注入行为 ,这比我正在寻找更多,似乎是我的需求过于复杂。