我正在尝试将应用程序(客户端)连接到公开的WCF服务,但不是通过应用程序配置文件,而是通过代码.
我应该怎么做呢?
这是我的电话采访问题:是否有时间不会在使用块声明范围的对象上调用Dispose?
我的回答是否定的 - 即使在使用块期间发生异常,仍会调用Dispose.
面试官不同意并说如果using包裹在try- catch块中,那么当你进入catch块时就不会调用Dispose.
这与我对构造的理解相反,我无法找到任何支持采访者观点的东西.他是正确的还是我误解了这个问题?
我试图在SO上扩展这个答案,使WCF客户端在瞬态网络故障时重试,并处理需要重试的其他情况,例如身份验证到期.
题:
什么是需要处理的WCF异常,以及处理它们的正确方法是什么?
以下是一些我希望看到的示例技术,而不是proxy.abort():
由于一个人不太可能知道解决它们的所有例外或方法,因此请分享您所知道的内容.我将在下面的代码示例中汇总答案和方法.
// USAGE SAMPLE
//int newOrderId = 0; // need a value for definite assignment
//Service<IOrderService>.Use(orderService=>
//{
// newOrderId = orderService.PlaceOrder(request);
//}
/// <summary>
/// A safe WCF Proxy suitable when sessionmode=false
/// </summary>
/// <param name="codeBlock"></param>
public static void Use(UseServiceDelegateVoid<T> codeBlock)
{
IClientChannel proxy = (IClientChannel)_channelFactory.CreateChannel();
bool success = false;
try
{
codeBlock((T)proxy);
proxy.Close();
success = true;
}
catch (CommunicationObjectAbortedException e)
{
// Object …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码,这些代码是许多ChannelFactory示例的典型代码:
WSHttpBinding myBinding = new WSHttpBinding();
EndpointAddress myEndpoint = new EndpointAddress(
ConfigurationSettings.AppSettings["HelloWorldServiceURL"]);
ChannelFactory<IHelloWorldService> myChannelFactory =
new ChannelFactory<IHelloWorldService>(myBinding, myEndpoint);
IHelloWorldService proxy = myChannelFactory.CreateChannel();
((IClientChannel)proxy).Open();
HelloWorldDataContract dc = proxy.SayHello();
((IClientChannel)proxy).Close();
Run Code Online (Sandbox Code Playgroud)
请注意,当调用proxy.Open()时,通道的状态和ChannelFactory的状态都变为"已打开".当调用proxy.Close()时,通道的状态变为"关闭",但ChannelFactory的状态仍为"已打开".
是否应该关闭ChannelFactory?在许多例子中我似乎没有看到这一点.另外,如果可能的话,请解释开放频道与开放频道工厂之间的区别.
另外,我知道IDisposable问题,因此除非它对答案有直接影响,否则它可能会被忽略.
我已经实现了ClientBase以使用WCF连接到服务.然后,我在通道上调用一种方法与服务进行通信.
base.Channel.CalculateSomething();
Run Code Online (Sandbox Code Playgroud)
这个调用线程是安全的还是应该在运行多个线程时锁定它?
谢谢
我们正在使用WCF服务
在客户端,我们计划明确关闭连接似乎有更多的关闭方式
Sample1:在WCF服务使用的finally块中使用
if (client.State == CommunicationState.Faulted)
{
client.Abort();
}
client.Close();
Run Code Online (Sandbox Code Playgroud)
因为如果服务处于故障状态,我们将无法调用close()
样品2:
using(ClientProxy proxy = new ClientProxy())
{
//call your service methods
}
Run Code Online (Sandbox Code Playgroud)
在sample2中我不确定如果服务处于故障状态会发生什么,它会在关闭连接时抛出错误吗?
简单的问题:我想使用默认浏览器打开一个URL,所以我就这样做了Process.Start(url).但是,我注意到这会返回一个IDisposable对象.
所以现在我想知道我是否必须处理它?或者,就此而言,如果我的应用程序以任何方式负责此过程?预期的功能只是"消防而忘记",我不希望我的应用程序作为新进程的父进程而且不需要与它进行交互.
我在SO上看到了一些类似但不相关的问题似乎只是说在URL上调用Process.Start很好,但我不想遇到一些难以调试的内存泄漏/资源耗尽问题导致我的程序保持不变引用长时间的浏览器进程.
当单个ClientBase<T>实例用于多个WCF服务调用时,它可以使通道进入故障状态(即,当服务停止时).
当服务再次出现时,我想自动修复频道.我找到的唯一方法是在每次方法调用之前调用以下代码:
if (clientBase.InnerChannel.State == CommunicationState.Faulted)
{
clientBase.Abort();
((IDisposable)clientBase).Dispose();
clientBase = new SampleServiceClientBase();
}
Run Code Online (Sandbox Code Playgroud)
我觉得这不是正确的做法.谁有更好的主意?
我们得到了
"通信对象System.ServiceModel.Channels.ServiceChannel不能用于通信,因为它处于Faulted状态."
关闭应用程序时的消息.谁能告诉我如何解决它?我们知道这是通信渠道试图关闭但由于服务不可用或处于故障状态而无法关闭.
我只能说,当服务不可用时,但垃圾收集器试图销毁对象,通信对象正在调用其服务关闭功能.我们得到例外.
我正在编写一个只接收来自本地主机的电话的服务.性能很重要,所以我想我会尝试NetNamedPipeBinding而不是NetTcpBinding,看看我是否能看到任何明显的性能提升.
如果客户端在对服务器执行了一个或多个请求之后,在较长时间内处于空闲状态,则下一个请求似乎会因绑定中的某些空闲超时而失败.服务重新启动时也会发生同样的事情.
我需要我的客户端能够在允许的情况下保持连接打开,以避免与设置新连接相关的开销.我还需要能够不时重新启动服务,并让客户端在发现连接已终止时自动重试.
我知道这可以通过NetTcpBinding中的可靠性内容来支持,但是如何在NetNamedPipeBinding中获得相同级别的重新连接可靠性呢?它甚至可能吗?
这个问题在某种程度上是学术性的,因为它不是使用NetNamedPipes的要求,我可以很容易地采用它来使用tcp绑定,但它是一个痒,我真的想要抓它.
wcf ×8
c# ×5
.net ×3
wcf-binding ×2
connection ×1
dispose ×1
duplex ×1
exception ×1
faulted ×1
using ×1
wcf-client ×1