Tag: #wcf

如何在不缓冲的情况下从WCF流式传输响应?

我有一个restful(webHttpBinding)自托管WCF服务。 大多数方法都将xml或json版本的对象返回给客户端。 我有几个触发长时间运行方法的GET方法,我想将日志响应流式传输到浏览器(或应用程序),以便用户知道发生了什么。 使用HttpContext.Current.Response.OutputStream.Write可以很容易地实现这一点。 不幸的是, HttpContext.Current在自托管WCF服务中始终为null,即使我包含aspNetCompatibilityEnabled配置(遗憾的是IIS不是一个选项)。 我尝试过AnonymousPipeServerStream : WCF和流请求和响应 以及第一个设置: OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse; context.ContentType = “text/plain”; 这样响应进入浏览器就不会将流下载到文件中进行保存。 在Chrome中它根本不起作用 – 它会缓冲到最后。 在IE或wget中,它似乎一次缓冲大约4k(或其他东西)。 这对于日志记录没有好处,除非我吐出大量不必要的日志消息来强制输出,用户并不真正知道发生了什么。 我只能假设这是因为响应实际上是一个分块响应而且块是4k(而不是只写入输出流)。 将chrome输出到输出的修复显然是在发送分块响应之前给内容写了一些垃圾: Chunked transfer encoding – 浏览器行为 ,但是,我不认为这对于WCF是可能的。 那么,我正在寻找可能的解决方案: 一种在自托管服务(无IIS)中写入WCF中的输出流的方法。 要么 一种控制流响应中的块大小的方法(以及首先编写一些内容以便Chrome将呈现块的方式)。 我认为另一种选择是放弃WCF,转而支持更友好的REST(我开始认为WCF不是正确的选择)。 但是,现在在WCF中写了这么多,这似乎是一项乏味的任务。 除非有一些我可以切换到的东西,这将是一个简单的迁移(例如,如果我可以重用相同的服务类,可能只有不同的属性)。 南希也许?

.NET中的video会议

我正在为我们的某个软件添加聊天function,我已经使用WCF启动并运行了聊天function。 我正在考虑尝试使用WCF再次添加video聊天function,基本上不是发送客户端消息,我将发送video流。 我想知道是否有人用WCF做过这件事? 是否建议使用WCF执行此操作? 任何人都使用(并推荐)任何组件(最好是开源)或.NET 4中的video会议库。感谢您的帮助。

DataContract序列化抽象类

我有一个接口IServiceInfo和一个抽象类ServiceInfo。 有几个inheritance自ServiceInfo的类,如CoreServiceInfo,ModuleServiceInfo等。有一个名为RootService的服务契约,它返回IServiceInfo。 public IServiceInfo GetServiceInfo() { return (IServiceInfo)new CoreServiceInfo(); } 我有序列化问题。 我可以使用ServiceKnownType来标识基类,使用KnownType来标识子类。 问题是我不知道所有的ServiceInfo子节点,因为应用程序可以有从ServiceInfoinheritance的不同子节点的插件,所以我不能告诉序列化器将序列化XML中的所有子节点。 我可以忽略抽象类,但它包含某些常见的实现,所以我需要保留它。 作为一种解决方法,我可以让另一个类说“sampleServiceInfo”并将所有info类转换为sampleServiceInfo并从Service方法返回它,并将KnownType定义为ServiceInfo类。 [KnownType(typeof(sampleServiceInfo))] public class ServiceInfo : IServiceInfo 但这听起来并不是很好的方式。 请建议。 我需要编写自定义序列化程序吗? 是否有任何方法只能序列化base并且当两者都有相同的成员时忽略它?

Web服务VS. Aspx页面:优点和缺点

我们开发了一个托管在内部网络上的ASP.Net Web应用程序。 目前,我们有一些ASPX页面可以处理来自客户端的Web请求并与我们的服务器进行交互。 我们正在开发下一个主要应用程序版本,我们正在决定架构。 与使用完整的Web服务(很可能是WCF服务)相比,使用ASPX页面处理http请求有什么区别? 在研究这个问题时,我发现了一些相关的post,这些post在这里和这里都有一定的帮助。 我对一些主要差异的理解如下: ASPX页面受限于他们可以接收的请求类型。 它们是严格的HTTP,而WCF服务可以有多个端点来服务各种协议(HTTP,TCP等)。 由于ServiceContracts,更具体地定义了WCF服务。 这意味着如果项目引用了服务,他们就会确切地知道在方法,用法和文档方面会有什么期望。 在包含的方法和接受的请求方面,ASPX页面对所有人来说都是免费的。 但是,基于这些概念,我的问题如下: 支持不同协议的能力在未来validation和兼容性方面是一个很好的特性,但是如果我们目前只使用它通过HTTP进行交互,我们看到了什么真正的好处? 根据我之前的观点,如果我们只是通过网络与服务进行交互,那么这些点中的任何一点真的有什么不同吗? 只要它所称的方法“正常工作”,http请求就不关心任何更精细的细节或合同保证。 有什么我想念的吗? 使用服务的任何关键好处? 就个人而言,我支持Web服务架构。 我喜欢拥有一个可以支持未来发展的灵活且定义明确的系统的想法。 我基本上想要摆脱这个是一种方式去同事说“这应该是一个服务的xyz原因,我们可以看到abc改进这样做”。

WCF中的动态对象不可能?

在WCF(json)中构建响应时,我很确定它不可能使用完全动态的对象,但只是想先在这里仔细检查。 一个理想的反应看起来像: “userTypes” : { “BartSimpson” : { “url” : “foo”, “desc” : “bar” }, “LisaSimpson” : { “url” : “foo”, “desc” : “bar” } } 在“编译”代码中,上述内容可以通过以下架构(稍微伪代码)执行: public class Character{ string url {get;set;} string desc{get;set;} } public class UserTypes{ public Character BartSimpson{get;set;} public Character LisaSimpson{get;set;} } 但我的主要目标是BartSimpson和LisaSimpson没有“编译”,所以我可以拥有任意数量的Character类,在响应中有任何名称/ LisaSimpson 。

两个WCF方法之间的全局变量

我在WCF服务中有两个方法说 Method1() { _currentValue = 10; } Method2() { return _currentValue; } 我有一种情况,我需要在Method1()中设置一个值,并在Method2()中读取它。 我尝试使用static变量如public static int _currentValue ,我能够读取Method2()中Method1()中设置的值。 但问题是,我希望这个变量像每个请求的单独实例变量一样做出反应。 即,现在下面是问题 浏览器1: – Method1() is called => sets _currentValue = 10; – Method2() is called => returns _currentValue = 10; 浏览器2: – Method2() is called => returns _currentValue = 10; 实际上,值集是浏览器1是静态的,因此在浏览器2中检索相同的值。 我想要实现的是变量应该像每个请求的新实例一样(从每个浏览器调用时)。 在这种情况下我应该使用什么? 会话?

在App.config中设置WCF ClientCredentials

是否可以在App.config中为WCF设置clientcredentials? 我想避免这样做: Using svc As New MyServiceClient svc.ClientCredentials.UserName.UserName = “login” svc.ClientCredentials.UserName.Password = “pw” … End Using 相反,登录名和密码应该是配置的一部分。

NetNamedPipeBinding安全吗?

我想知道netNamedPipeBinding是否被认为是安全的: 一方面,NetNamedPipeBinding仅在传输层上实现安全性,并且它使用Microsoft不再推荐的NTLM( 源 )( 源 ) 另一方面,无法从远程计算机访问命名Pipie,并且无法窃听用于传输数据或向其写入数据的特定打开管道实例,除非可以获取特定实例的句柄关心。 这就是为什么我不知道如何考虑这个解决方案的安全性的原因。

为WCF设置Ninject

有没有人有关于如何在WCF中设置Ninject的明确指示? 谷歌搜索,但我看不到有关如何在WCF中使用Ninject的任何更新指南。

单个WCF信道性能与多个信道

我有一个应用程序一遍又一遍地重用相同的WCF通道。 我通过工厂对象保留静态引用。 我想知道这是好的实践还是我应该打开x频道并通过这些频道循环所有服务呼叫而不是使用单一频道? 如果仅使用1个通道,这些服务调用是否会排队,或者当我使用x通道时会发生同样的情况吗?