Tag: wcf

使用async / await调用WCF服务的模式

我使用基于任务的操作生成代理。 应该如何正确调用这个服务(之后处理ServiceClient和OperationContext )使用async / await? 我的第一个尝试是: public async Task<HomeInfo> GetHomeInfoAsync(DateTime timestamp) { using (var helper = new ServiceHelper<ServiceClient, ServiceContract>()) { return await helper.Proxy.GetHomeInfoAsync(timestamp); } } 作为ServiceHelper创buildServiceClient和OperationContextScope的类,然后处理它们: try { if (_operationContextScope != null) { _operationContextScope.Dispose(); } if (_serviceClient != null) { if (_serviceClient.State != CommunicationState.Faulted) { _serviceClient.Close(); } else { _serviceClient.Abort(); } } } catch (CommunicationException) […]

如何为WCF服务创build全局exception处理程序?

我想logging所有的exception服务器端 。 在ASP.NET中,我在Global.asax.cs中写这样的东西,但是这也可以用于WCF服务吗? public class Global : HttpApplication { protected void Application_Error(object sender, EventArgs e) { Exception unhandledException = Server.GetLastError(); //Log exception here … } } 更新:我不想有一个尝试…赶上我的.svc文件中的每个[OperationContract]。 我简短…我想确保我的服务抛出的所有exception都由log4netlogging。 我不是在谈论客户端如何处理exception。

WCFTestClient HTTP请求是未经授权的客户端身份validationscheme“匿名”

我已经创build了一个WCF服务并将其部署在Server上。 当我浏览这个服务,它给了我积极的回应?wsdlurl。 现在我试图通过WCF Test客户端来testing服务。 它显示适当的元数据。 但是,当我尝试从服务中调用任何方法时,它显示了一个例外…这里是堆栈跟踪的错误细节.. HTTP请求未经授权,客户端身份validationscheme为“匿名”。 从服务器收到的身份validation头是“Negotiate,NTLM”。 服务器堆栈跟踪: 在 System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest请求,HttpWebResponse响应,WebException responseException,HttpChannelFactory工厂) HTTP请求未经授权,客户端身份validationscheme为“匿名”。 从服务器收到的身份validation头是“Negotiate,NTLM”。 服务器堆栈跟踪: 在 System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest请求,HttpWebResponse响应,WebException responseException,HttpChannelFactory工厂) 客户端绑定: <bindings> <wsHttpBinding> <binding name="WSHttpBinding_IServiceMagicService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> <security mode="None"> <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> […]

WCF:暴露只读的DataMember属性没有设置?

我有一个服务器端类,通过[DataContract]在客户端提供。 这个类有一个只读字段,我想通过一个属性提供。 然而,我无法这样做,因为似乎我没有被允许添加一个[DataMember]属性,而没有得到和设置。 所以 – 是否有一种方法来拥有一个[DataMember]属性而不需要setter? [DataContract] class SomeClass { private readonly int _id; public SomeClass() { .. } [DataMember] public int Id { get { return _id; } } [DataMember] public string SomeString { get; set; } } 或者解决scheme将使用[DataMember]作为字段 – (如图所示)? 试图这样做,但它似乎并不在意字段是只读的? 编辑 :是唯一的方法来通过黑客这样做只读属性? (不 – 我不想这样做…) [DataMember] public int Id { get { […]

WCF – net.pipe与net.tcp与http绑定

我是WCF的新手,想了解以下每个绑定的差异/优点/限制/等等: net.pipe net.tcp http 有关何时使用每个绑定和其他示例的支持情况,将不胜感激。

在部署环境之间pipe理复杂的Web.Config文件

有谁知道在不同的构build/部署环境之间pipe理Web.Config文件的好工具/实用程序吗? 例如,我有一个开发中的WCF项目,我不想启用SSL,但是我希望在生产中启用它。 我想要不同的日志logging设置,不同的数据库连接string,不同的error handling,不同的文件path…甚至一些不同的统一框架绑定(unit testing,而不是真正的对象部署)。 保持Web.Config单独副本是一个痛苦,因为添加新的Web服务意味着编辑多个文件并保持同步。 我也注意到,如果你手工过多地使用Web.Config ,如果你尝试使用“add item”向导来为WCF添加一个新的Web服务,Visual Studio将会窒息,因为它必须修改Web.Config来添加端点,并且不能再parsing它。 所以我必须小心不要使现有的Web.Config无效。 我也想过使用一些正则expression式来replace,只是在预编译命令中build立一个新的Web.Config 。 这似乎是迄今为止最好的select… 任何其他的想法? 看起来这应该是一个非常普遍的问题,因为Web.Config在开发和生产部署之间可能永远不会相同。 更新: 我决定编写一个快速的控制台应用程序,将所有的XML文件在一个给定的目录,并合并成一个,只包括基于名称的某些文件。 所以我可以在一个目录中做出: WebConfig_All <configuration> <configSections> … </configSections> <system.web> … </system.web> </configuration> connectionStrings_Debug <configuration> <connectionStrings> <add name="connstr" connectionString="…dev…" /> </connectionStrings> </configuration> connectionStrings_Release <configuration> <connectionStrings> <add name="connstr" connectionString="…prod…" /> </connectionStrings> </configuration> 然后运行我的命令行工具,并传入configuration(debugging,释放,自定义…),它将合并所有以_All" or _ <configuration>`结尾的文件。 所以现在我在单个WebConfig_All文件中有80%的Web.Config,而每个构buildconfiguration中有20%的自定义内容在不同的文件中。 我可以运行我的命令行工具作为预生成任务在VisualStudio中,或从NAnt,或任何我想要的… 我也使我的XML合并逻辑足够好处理像这样的东西: <x> <ya="1"> […]

WCF:属性与成员上的DataMember属性

在wcf中,在属性上应用DataMember属性有什么区别 private int m_SomeValue; [DataMember] public int SomeValue { get {…} set {…} } 而不是一个成员variables [DataMember] private int m_SomeValue; public int SomeValue { get {…} set {…} } ?

我们可以创build自定义HTTP状态代码吗?

我有一个REST和WCF服务,并希望发送一个基于操作的自定义状态代码。 当一些validation失败的例子,然后我想发送HTTP 444,当授权失败,我想发送HTTP 455 问题是我们如何validationSOAP和REST Web服务。 在客户端上,错误代码如何起作用,因为当您从WCF服务(使用SOAP)发送HTTP 400/500时,将在客户端显示状态码。 现在,如果我发送一个新的自定义状态代码,客户端如何处理这个?

获取在Windows Server 2008 R2上运行的MSDN PeerChannel“SecureChat”

我只能得到这个PeerChannel SecureChat的SDK样本在基本家庭networking中的以下情况下工作: 本地在同一台机器上运行的实例中,或 在Windows 7机器中 我无法在Windows Server 2008 R2和任何其他机器之间使用这个工具(没有任何exception,但是节点永远不会find对方,因此不会“在线”)。 我可以ping所有机器中的IPv6地址。 该可执行文件有一个防火墙例外规则,但我也尝试完全禁用Windows 2008防火墙。 PRNP服务正在运行。 是否有可能得到它的工作? 怎么样? 它在您的2008机器上工作吗? 我最好的猜测:我注意到,在Windows 7机器上,存在“对等networking分组”和“对等networking身份pipe理器”服务。 那里的“对等networking分组”服务的描述和在线谈话是关于启用多方对话,但与家庭组相关的。 Windows Server计算机中缺less此服务。 所以,我怀疑这个缺less的服务是SecureChat示例在Windows Server计算机上无法运行的原因,但是我不明白为什么微软会lockingPeer Channel来处理Server产品。 这可能是原因吗? 谢谢!

生成密码安全的身份validation令牌

背景: 这实际上是一个普遍的最佳实践问题,但是关于具体情况的一些背景可能会有帮助: 我们正在为iPhone开发一个“连接”应用程序。 它将通过REST服务与后端应用程序进行通信。 为了不必在每次启动应用程序时提示用户input用户名和密码,我们将公开一个“login”服务,在首次启动时validation用户名和密码,并返回一个可用于未来networking的身份validation令牌对真实数据的服务请求。 令牌可能会有一个到期时间,之后我们会要求他们用他们的用户名/密码重新进行validation。 问题: 生成这种用于身份validation的令牌的最佳做法是什么? 例如,我们可以… 散列(SHA-256等)一个随机string,并将其存储在给定用户的数据库中,并附带过期date。 在后续的请求上做一个简单的查询,以确保匹配。 使用密钥encryption用户标识和一些附加信息(时间戳等)。 解密后续请求令牌,以确保它是由我们发出的。 这感觉就像是一个解决的问题。