我有一个SOA应用程序,它使用Windows服务中托管的双工WCF服务.客户端本身是WPF应用程序.
我在关闭和重新启动客户端应用程序时看到异常行为.如果我在关闭一个实例后开始一个新实例,那么看起来就不会发生任何事情.但是,检查任务管理器会显示新实例正在作为后台进程运行.如果我尝试启动客户端应用程序的另一个新实例,它将显示我写的错误屏幕 - 说明服务的错误.调查显示客户端无法创建服务回调通道的新实例,因为另一个应用程序已经注册了URL.这是一个System.ServiceModel.AddressAlreadyInUseException.
如果我然后在任务管理器中结束后台客户端任务,则显示错误消息的客户端可以连接到服务并正常运行.我还注意到,如果在启动新实例之前关闭后台任务,则新实例也不会出现.
我担心的是,这是不可用的,对用户来说感觉真的很麻烦.怎么可能出错?似乎有些事情没有清理非托管资源但是我使用了ANTS并且无法识别它.客户端创建为:
IServiceCallback callback = new Callback();
_context = new InstanceContext(callback);
_channelFactory = new DuplexChannelFactory<IMyService>(_context, binding, endpoint);
_proxy =
_channelFactory.CreateChannel();
((ICommunicationObject)_proxy).Open(TimeSpan.FromSeconds(5));
Run Code Online (Sandbox Code Playgroud)
Service的构造函数使用以下代码:
_callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>();
var commObject = _callback as ICommunicationObject;
if (commObject != null)
{
commObject.Faulted += ChannelFaulted;
commObject.Closing += ChannelClosing;
commObject.Closed += ChannelClosed;
}
OperationContext.Current.Channel.Faulted += ChannelFaulted;
OperationContext.Current.Channel.Closed += ChannelFaulted;
Run Code Online (Sandbox Code Playgroud)
在关闭之前,客户端调用服务的Disconnect方法,该方法执行以下操作:
var commObject = _callback as ICommunicationObject;
if (commObject != null)
{
commObject.Faulted -= ChannelFaulted;
commObject.Closing -= ChannelClosing;
commObject.Closed -= ChannelClosed;
}
OperationContext.Current.Channel.Faulted -= …Run Code Online (Sandbox Code Playgroud) 我有一个基于WCF双工服务的应用程序.当用户"重新启动"应用程序所做的工作时,我遇到了问题......客户端关闭了与WCF服务的连接并创建了另一个.服务合同的定义是这样的......
[ServiceContract(Namespace="net.tcp://namespace.MyService",
SessionMode=SessionMode.Required,
CallbackContract=typeof(IServiceCallback))]
public interface IMyService
{
[OperationContract(IsOneWay=true)]
void DoWork();
}
public interface IServiceCallback
{
[OperationContract(IsOneWay=true)]
void SendMessage(string message);
}
Run Code Online (Sandbox Code Playgroud)
实现定义为:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single,
InstanceContextMode = InstanceContextMode.PerSession,
UseSynchronizationContext = false,
IncludeExceptionDetailInFaults = true)]
public class MyService : IMyService
{
public void DoWork()
{
var callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>();
callback.SendMessage("Hello, world.");
}
}
Run Code Online (Sandbox Code Playgroud)
客户端的配置如下:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="net.tcp" receiveTimeout="02:00:00" sendTimeout="02:00:00" maxReceivedMessageSize="2147483647">
<security mode="None"/>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:8000/MyService/MyService"
binding="netTcpBinding" bindingConfiguration="net.tcp" contract="ExternalServiceReference.IMyService">
</endpoint>
</client>
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)
配置服务:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior …Run Code Online (Sandbox Code Playgroud) 假设我有一个整数序列,从0(总是从0开始)到3.现在,我有一个整数数组,它将从一个点开始依次保持那些序列循环.例如:
10个元素的数组,序列为0到3,从2开始,应该产生2,3,0,1,2,3,0,1,2,3.
5个元素的数组,序列0到5,从5开始,应该产生5,0,1,2,3.
5个元素的数组,序列0到10,从3开始,应该产生3,4,5,6,7.
我正在脑部冻结!如果您知道数组大小,序列中的最大数量和起始值,那么创建此数组的最佳方法是什么?
我最好的尝试是:
private static int[] CreateIndexers(int index, int size, int players)
{
var indexers = new int[size];
for (int i = 0; i < size; i++)
{
var division = i / players;
var newInt = division + i >= players ? ((division + i) - players) : division + i;
indexers[i] = newInt;
}
return indexers;
}
Run Code Online (Sandbox Code Playgroud)