相关疑难解决方法(0)

WCF客户端"使用"块问题的最佳解决方法是什么?

我喜欢在using块中实例化我的WCF服务客户端,因为它几乎是使用实现的资源的标准方法IDisposable:

using (var client = new SomeWCFServiceClient()) 
{
    //Do something with the client 
}
Run Code Online (Sandbox Code Playgroud)

但是,正如本MSDN文章中所述,在using块中包装WCF客户端可能会掩盖导致客户端处于故障状态的任何错误(如超时或通信问题).简而言之,当调用Dispose()时,客户端的Close()方法会触发,但会因为处于故障状态而抛出错误.然后,第二个异常掩盖了原始异常.不好.

MSDN文章中建议的解决方法是完全避免使用using块,而是实例化您的客户端并使用它们,如下所示:

try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}
Run Code Online (Sandbox Code Playgroud)

using块相比,我认为这很难看.每次需要客户端时都需要编写很多代码.

幸运的是,我发现了一些其他的解决方法,例如IServiceOriented上的这个.你从:

public delegate void UseServiceDelegate<T>(T proxy); 

public static class Service<T> 
{ 
    public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>(""); 

    public static void Use(UseServiceDelegate<T> codeBlock) 
    { …
Run Code Online (Sandbox Code Playgroud)

c# vb.net wcf using wcf-client

400
推荐指数
10
解决办法
11万
查看次数

SoapHttpClientProtocol线程安全吗?

我使用VS 2008(c#)的"添加Web引用"功能创建了一个Web服务代理.

生成的类派生自 SoapHttpClientProtocol

我可以只在单例中存储我的代理的一个实例吗?它是线程安全的吗?呼叫之间是否存在阻止我这样做的状态?

c# proxy web-services asmx thread-safety

9
推荐指数
2
解决办法
2907
查看次数

实现异步WCF服务

我有一个WPF应用程序,我正在使用WCF分离到客户端和服务器端.我不喜欢我最初用直接解决方案得到的混乱,所以现在我正在根据MCFel Castro,WCF Extreme的截屏视频中的建议进行重组.如果您不熟悉视频,他基本上手动设置整个通信 - 不使用服务引用.这包括:

  • 与所有服务和数据合同的通用合同 - 由客户端和服务器引用
  • 托管服务的控制台应用程序
  • 客户端上的代理类映射服务,并将调用传递给它(使用ClientBase或ClientFactory)

我已经完成了他所有的步骤,我真的很喜欢这里的发展方向.但是,他没有解决异步服务调用,这就是我想要使用的.

添加服务引用时,我可以选中"生成异步操作"复选框,然后获取MyServiceCompleted和MyServiceAsync.但是,我想这是在添加服务引用时生成的东西,而不是这个构建的类中的一些魔法?

那么,我能以某种方式从ClientBase或ClientFactory获取异步操作吗?或者我是否必须将实际的服务器端服务定义为异步?如果是这样 - 有人可以给我一些关于如何开始使用简单异步服务的提示或示例吗?我一直在MSDN上阅读这个主题,但它让我感到很困惑,因为我已经没有得到这个了...

.net service wcf asynchronous

6
推荐指数
1
解决办法
7227
查看次数