Tag: #wcf

Web服务和远程处理有什么区别?

我知道Web服务并且对远程处理有一定的了解。 这两个概念都在客户机上调用方法,所以区别在哪里? 通过远程处理我们也可以在远程机器上执行该方法,同样的function也可以通过Web服务实现。 如果这是一个明显的问题,请原谅我..

WCF,BasicHttpBinding:停止新连接但允许现有连接继续

.NET 3.5,VS2008,使用BasicHttpBinding的WCF服务 我有一个Windows服务托管的WCF服务。 当Windows服务因升级,定期维护等原因关闭时,我需要正常关闭我的WCF服务。 WCF服务的方法可能需要几秒钟才能完成,而典型的卷每秒需要2-5个方法调用。 我需要以允许任何先前调用方法完成的方式关闭WCF服务,同时拒绝任何新调用。 通过这种方式,我可以在约5-10秒内达到安静状态,然后完成Windows服务的关闭周期。 调用ServiceHost.Close似乎是正确的方法,但它会立即关闭客户端连接,而无需等待任何正在进行的方法完成。 我的WCF服务完成了它的方法,但是没有人发送响应,因为客户端已经断开连接。 这是此问题提出的解决方案。 以下是事件序列: 客户端使用VS生成的代理类调用服务方法 服务开始执行服务方法 服务收到关闭请求 服务调用ServiceHost.Close(或BeginClose) 客户端已断开连接,并收到System.ServiceModel.CommunicationException 服务完成服务方法。 最终服务检测到它没有更多的工作要做(通过应用程序逻辑)并终止。 我需要的是客户端连接保持打开,以便客户知道他们的服务方法成功完成。 现在他们只是获得了一个封闭的连接,并且不知道服务方法是否成功完成。 在使用WCF之前,我使用套接字并且能够通过直接控制Socket来实现。 (即在仍然执行接收和发送时停止接受循环) 关闭主机HTTP端口非常重要,以便上游防火墙可以将流量定向到另一个主机系统,但现有连接保持打开状态以允许现有方法调用完成。 有没有办法在WCF中实现这一目标? 我尝试过的事情: ServiceHost.Close() – 立即关闭客户端 ServiceHost.ChannelDispatchers – 在每个上调用Listener.Close() – 似乎什么都不做 ServiceHost.ChannelDispatchers – 在每个上调用CloseInput() – 立即关闭客户端 覆盖ServiceHost.OnClosing() – 让我延迟关闭,直到我决定关闭,但在此期间允许新的连接 使用此处描述的技术删除端点。 这抹去了一切。 运行网络嗅探器以观察ServiceHost.Close()。 主机只关闭连接,不发送任何响应。 谢谢 编辑 :不幸的是,我无法实现系统正在关闭的应用程序级别的咨询响应,因为该领域的客户端已经部署。 (我只控制服务,而不是客户端) 编辑 :我使用Redgate Reflector来查看Microsoft的ServiceHost.Close实现。 不幸的是,它调用了一些我的代码无法访问的internal帮助器类。 编辑 :我还没有找到我想要的完整解决方案,但是Benjamin建议在输入服务方法之前使用IMessageDispatchInspector拒绝请求。

如何使用DataContractJsonSerializer将类类型而不是命名空间序列化为Json字符串

我正在尝试在WCF服务中使用DataContractJsonSerializer将类层次结构序列化为Json字符串。 序列化派生类的默认行为是将以下键值对添加到对象: “__type”:”ClassName:#Namespace” 我的问题是命名空间很长并且它们使Json字符串膨胀。 我想以某种方式干预序列化并输出它: “__type”:”ClassName” 并且在反序列化时再次介入指向正确的命名空间(我在运行时知道)。 有没有办法做这样的事情?

如何解决“HTTP错误404.3 – 未找到”错误?

简单的问题。 我启动VS2008并创建一个新的WCF服务应用程序。 这将创建一个默认应用程序,其中包含一些显示其可用的测试方法。 我按CTRL + F5确实有效! 大! 但是,它使用Visual Studio Development服务器,我不想支持它。 所以我转到项目属性,切换到使用本地IIS Web服务器,创建虚拟目录并再次按CTRL + F5。 而这个“HTTP错误404.3 – 未找到”错误让我回想起来。 因此我的IIS7 / Vista-64设置中的某些内容是错误的。 我能错过什么?

WCF服务运行状况监视

我刚刚实现了WCF服务,我目前正在寻找服务监控选项。 我们当前仅托管java服务的服务器团队希望我们一直运行实例,因此它可以在其生命周期内收集该实例中的数据,并且他们表示他们将使用我们的一个操作与webmon获取统计信息。 但我们正在使用每次通话,我不认为这将在这种架构下工作。 我想知道是否有办法获取服务中的操作如何在一定时间内完成的统计数据,并为webmon提供另一个操作,使其在某个时间段内给出关于其性能的整数值,webmon,然后决定天气以提醒管理员。 我正在考虑解析日志文件以获取统计信息,但如果每15分钟完成一次,这可能是一项昂贵的操作。 如果不是我对wcf应用程序的详细自动健康监测的选择是什么?

WCF点对点,那里有节点吗?

我在.NET 3.5中使用WCF来实现对等网络应用程序。 要解析对等节点,我使用的是PNRP。 IGlobalStoreServiceContract是我的合同,如下所示, [ServiceContract(Namespace = “http://GlobalStoreEventDriven.API”, CallbackContract = typeof(IGlobalStoreServiceContract))] internal interface IGlobalStoreServiceContract { [OperationContract(IsOneWay = true)] void NotifyGlobalStoreDataInserted(string globalGroup, DateTime maxDateTime); [OperationContract(IsOneWay = true)] void RegisterNode(); [OperationContract(IsOneWay = true)] void SynchronizeMemberList(Guid clientId); } 我使用这样的代码将每个节点加入到对等网络。 DuplexChannelFactory channelFactory = new DuplexChannelFactory(instance, “GlobalStoreAPIEndPoint”); IGlobalStoreChannel globalStoreChannel = channelFactory.CreateChannel(); globalStoreChannel.Open(); 我的问题是,一旦打开频道,我怎样才能最好地判断网络上是否存在其他对等节点? 例如,我可以调用我的合同RegisterNode中的一个方法,并且网络中的每个节点都可以使用回调来调用SynchronizeMemberList。 然后我会知道是否有其他节点。 麻烦就是它都是异步的。 如果我调用RegisterNode并且没有人回复,那并不意味着没有人在那里,这可能只是意味着我没有等待足够长的时间。 你怎么看? 有什么建议?

如何使用WCF服务临时停止证书错误

我正在测试我创建的WCF Web服务的早期版本。 在客户端,当我使用VS来“添加服务引用”时,一切正常。 但是当我尝试使用该服务时,我得到错误, Could not establish trust relationship for the SSL/TLS secure channel with authority ** 星号代表服务器的IP地址。 无论如何在服务器上有一个安全证书,但它只是为了测试自己生成的,所以我暂时不关心证书错误。 在客户端,已经为我生成了app.config, 那么我需要更改哪些设置才能暂时忽略证书错误?

使用WCF实现观察者模式

当我第一次发布这个问题时,我的Web服务和应用程序控制器之间有很强的耦合,控制器需要打开多个线程到服务,并且当它接收到数据时,它必须对返回的数据进行大量处理并将其合并到一个数据集。 我不喜欢客户端在准备好使用它之前必须处理和合并返回的数据这一事实,并希望将该层移动到服务并让服务打开供应商的异步线程并合并结果在将它们返回给客户之前。 我遇到的一个挑战是,我不能等到所有线程完成并且结果合并,我必须开始接收数据,因为它可用。 这叫我在服务上实现一个观察者模式,以便在合并新的结果集并准备好使用它并将它们发送到应用程序时通知我的应用程序。 我正在寻找如何使用ASMX webservices或WCF执行此操作,到目前为止,我已经发现使用WCF实现它,但此线程始终是开放的建议和改进。

WCF重试代理

我正在努力寻找实现WCF重试的最佳方法。 我希望尽可能让客户体验尽可能干净。 我知道有两种方法(见下文)。 我的问题是:“ 我缺少第三种方法吗?也许是一种普遍接受的做法? ” 方法#1 :创建实现服务接口的代理。 对于每次调用代理,请执行重试。 public class Proxy : ISomeWcfServiceInterface { public int Foo(int snurl) { return MakeWcfCall(() => _channel.Foo(snurl)); } public string Bar(string snuh) { return MakeWcfCall(() => _channel.Bar(snuh)); } private static T MakeWcfCall(Func func) { // Invoke the func and implement retries. } } 方法#2 :将MakeWcfCall()(上面)更改为public,并让消费代码直接发送func。 我不喜欢方法#1,每次接口更改时都必须更新Proxy类。 我不喜欢方法#2的是客户端必须将其调用包装在func中。 我错过了更好的方法吗? […]

如何在代码中设置ServiceHostingEnvironment.AspNetCompatibilityEnabled = true(不在配置中).NET / C#

我需要从RESTful WCF服务中使用-h访问HttpContext.Current。 我知道我可以通过在config中添加以下内容来实现此目的: 并在我的服务上使用以下属性: [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 这是我的问题,我需要在代码中“旋转”一个服务实例进行unit testing,因此我不能使用配置文件来指定服务bebaviours等。目前我的代码看起来如下,但尽管在网上搜索我我一直无法弄清楚如何设置ServiceHostingEnvironment类并将AspNetCompatibilityEnabled属性设置为true而不使用config,任何人都可以帮忙吗? string serviceUrl = “http://localhost:8082/MyService.svc”; _host = new ServiceHost(typeof(MyService), new Uri[] { new Uri(serviceUrl) }); ServiceEndpoint serviceEndpoint = _host.AddServiceEndpoint(typeof(IMyService), new WebHttpBinding(), string.Empty); serviceEndpoint.Behaviors.Add(new WebHttpBehavior()); // Here’s where I’m stuck, i need something like… ServiceHostingEnvironmentSection shes = new ServiceHostingEnvironmentSection(); shes.AspNetCompatibilityEnabled = true; _host.Add(shes); _host.Open(); 任何帮助都非常感谢,并提前感谢。