小编MrS*_*oes的帖子

不寻常的WCF客户端行为

我有一个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)

c# wpf wcf

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

WCF双工服务频道关闭

我有一个基于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)

c# wcf

5
推荐指数
1
解决办法
2045
查看次数

序列数组

假设我有一个整数序列,从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)

c# arrays

3
推荐指数
2
解决办法
1266
查看次数

标签 统计

c# ×3

wcf ×2

arrays ×1

wpf ×1