小编Ela*_*lan的帖子

UDP服务器发现 - 客户端应该发送多播以查找服务器还是服务器应该发送常规信标?

我的客户端需要连接到单个服务器进程.我正在使用UDP发现为客户端找到服务器.我有客户端和服务器交换IP地址和端口号,以便在完成发现后建立TCP/IP连接.这样,数据包大小保持很小.我看到这可以使用UDP以两种方式之一完成:

  1. 每个客户端发出自己的多播消息以搜索服务器,然后服务器响应该服务器.客户端可以定期重复发送此多播消息(在服务器关闭的情况下),直到服务器响应.
  2. 服务器定期发送多播消息信标.客户端订阅多播组,并以这种方式接收服务器的多播消息并完成发现.

在1.如果有许多客户端,那么最初将传输许多多播消息(每个客户端一个).只有服务器才会订阅并从客户端接收多播消息.一旦服务器响应客户端,客户端就不再发送多播消息.一旦所有客户端完成了对服务器的发现,就不会在网络上传输进一步的多播消息.但是,如果服务器关闭,则每个客户端将间隔发送多播消息信标,直到服务器备份并且可以响应.

在2.只有服务器会定期提交多播消息信标.此消息最终将路由到订阅多播组的所有客户端.客户端收到数据包后,客户端的UDP侦听套接字将关闭,并且不再订阅多播组.但是,服务器必须继续发送多播信标,以便新客户端可以发现它.它将继续定期发送信标,无论是否有任何客户端需要发现它们.

所以,无论如何,我都看到了利弊.在我看来,#1最初会导致更重的负载,但这个负载最终会降低到零.在#2中,服务器将继续永远发送信标.

UDP和多播对我来说是一个相当新的话题,所以我有兴趣找出哪种方法是首选方法,哪些方法可以减少网络负载.

sockets udp multicast discovery

9
推荐指数
1
解决办法
8067
查看次数

如何防止屏幕阅读器/叙述者读取WPF中隐藏的控件?

我有一个WPF应用程序,它需要支持可访问性.我有一个TextBlock,在某些条件下将其Visibility设置为Collapsed.

Windows 7解说员和NVDA屏幕阅读器都宣布了TextBlock,因此Visibility设置为Collapsed.

我需要做些什么才能防止它被阅读?

wpf xaml automation accessibility screen-readers

9
推荐指数
1
解决办法
1258
查看次数

无法从Windows服务访问驱动器映射的网络共享上的文件

我有一个网络共享文件夹映射到一个驱动器号,可以从Windows资源管理器,命令提示符以及我的WinForms应用程序访问,没有问题.它也可以使用UNC路径从我的Windows服务访问.

但是,当我尝试使用Windows服务中的映射驱动器号访问此网络位置时,访问失败.Windows服务配置为使用我的个人"登录"帐户凭据,这在上述所有情况下都是相同的.我是管理员.

许多客户站点使用驱动器号来获取网络共享,我无法始终控制它并强制它们指定UNC路径.我需要能够使用Windows服务中的驱动器号访问网络共享.

我需要做什么来设置我的Windows服务,以便它可以访问映射到驱动器号的网络共享文件夹?我的Windows服务是用C#编写的.

c# windows-services network-share mapped-drive

8
推荐指数
1
解决办法
2万
查看次数

优雅地终止WCF服务 - 完成所有打开的会话并限制新会话

我有一个我写的WCF服务,它托管在Windows服务中.它以PerSession模式运行.该服务允许客户端通过该服务打开文件,更改文件和远程关闭文件.到目前为止,所有工作都很顺利

当Windows服务停止时,我希望能够使WCF服务不接受任何新会话,并允许已连接的客户端完成其当前会话并工作(在合理的时间段/超时内).

实现这一目标的最佳方法是什么?

session wcf windows-services

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

可以阻止单个应用程序的Microsoft错误报告吗?

我们有一个非托管C++应用程序,它利用第三方API来读取CAD文件.在某些损坏的CAD文件上,第三方库崩溃并使我们的EXE失效.因此,我们的主应用程序是一个单独的EXE,这样它就不会受到崩溃的影响.然而,我们最终得到了恼人的Microsoft错误报告对话框.

我不想在系统范围内禁用Microsoft错误报告.有没有一种方法来关闭错误报告单个应用程序,因此,如果它崩溃,它静静地崩溃没有错误弹出对话框?

c++ crash unmanaged

6
推荐指数
4
解决办法
2218
查看次数

可以在IClientChannel代理上调用Abort()会抛出异常吗?

根据文档和文章,如果遇到意外的异常/错误,建议在客户端代理上调用Abort().请参阅以下(简化):

MyServiceClient proxy = null;
try {
    proxy = new MyServiceClient();
    proxy.DoSomething();
    proxy.Close();
} catch (Exception ex) {
    if (proxy != null)
        proxy.Abort();
}
Run Code Online (Sandbox Code Playgroud)

是否有可能调用Abort()自己抛出异常?对Abort()的调用应该在自己的try/catch中吗?

wcf proxy abort wcf-client

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

如何在 StyleCop 设置和并发中的单个“自定义规则”节点下组合多个自定义 StyleCop 规则

基于几篇好文章,我已经能够成功创建一些自定义 StyleCop 规则。作为参考,这里列出了我发现关于该主题非常有用的几篇文章:

我正在使用 Visual Studio 2010 Ultimate 版本和 StyleCop 版本 4.4.0.14。

创建自定义 StyleCop 规则需要创建一个类文件以及相应的 XML 文件,该文件用于将规则添加到 StyleCop 设置中。当我这样做时,我的所有自定义规则都会正确执行。然而,我不喜欢的是,在 StyleCop 设置树中,您最终会获得多个“自定义规则”节点,每个 XML 文件对应一个节点。

跳过不同规则的实现细节,这就是我所做的。让我们采用以下两个简单的自定义规则类及其相应的 XML 文件:

文件:CustomRule1.cs

namespace StyleCop.CustomRules
{
    [SourceAnalyzer(typeof(CsParser))]
    public class CustomRule1 : SourceAnalyzer
    {
        public override void AnalyzeDocument(CodeDocument document)
        {
            Param.RequireNotNull(document, "document");
            CsDocument csDocument = document as CsDocument;
            if …
Run Code Online (Sandbox Code Playgroud)

c# stylecop

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

以基本形式定义的自定义属性在重建时会以继承的形式丢失其状态

我遇到基本形式的属性无法以继承形式维护状态的问题.

环境:

  • Visual Studio 2010 Ultimate Service Pack 1:版本10.0.40219.1 SP1Rel
  • .Net Framework:版本4.0.30319 SP1Rel
  • Windows 7旗舰版

下面是重现的源代码和步骤:

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace Test
{
    public partial class BaseForm : Form
    {
        [DefaultValueAttribute(true)]
        public bool ControlVisible
        {
            get
            {
                return this.checkBox1.Visible;
            }
            set
            {
                this.checkBox1.Visible = value;
            }
        }

        [DefaultValueAttribute(false)]
        public bool ControlChecked
        {
            get
            {
                return this.checkBox1.Checked;
            }
            set
            {
                this.checkBox1.Checked = value;
            }
        }

        public BaseForm()
        {
            InitializeComponent();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面,默认属性与[DefaultValueAttribute]匹配,即在InitializeComponent()中,checkBox1.Visible设置为true,checkBox1.Checked为false.这些是放在表单上时控件的默认设置.

然后我创建了以下继承的表单:

using System;
using System.ComponentModel;
using …
Run Code Online (Sandbox Code Playgroud)

c# inheritance designer properties winforms

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

如何在 C# 中枚举网络共享和 Web 文件夹?

.Net 为我们提供了一个 FolderBrowserDialog 控件来浏览文件夹。然而,这是一个模式对话框。我需要创建一个可以放到表单上的用户控件。所以,我一直在考虑创建自己的,我需要在其中获取所有本地驱动器、映射网络驱动器、UNC 共享和 Web 文件夹(WebDAV/SharePoint)。我使用的是 Windows 7 和 .Net 4.0。

本地和映射网络驱动器
我可以从 DriveInfo.GetDrives() 获取本地驱动器。但是,这些仅向我显示可用/在线的驱动器。在 Windows 资源管理器中,您还会看到已断开连接/不可用的映射网络驱动器。

网络文件夹/UNC 共享
根据我目前所发现的,.Net 中似乎没有枚举 UNC 共享的机制。看来我必须使用 Interop 到 Win32 API 才能使用WNetOpenEnumWNetEnumResource函数来枚举网络邻居。我得到了这个工作,但想知道是否有其他方法。

Web (WebDAV) 文件夹和 SharePoint
在 Windows 资源管理器中,我配置了几个 WebDAV 文件夹。使用上面相同的互操作调用WNetOpenENumWNetENumResource我得到了一个节点“Web 客户端网络”,并且出现了已连接和可访问的 WebDAV 文件夹。

问题

  1. 如何获取已配置但离线的映射网络驱动器?
  2. 是否有另一种枚举 UNC 共享的方法,或者我是否坚持使用上述命名的互操作调用?
  3. WNetEnumResource要回我要“微软终端服务”的空节点。如何过滤掉这个,而不是基于英文文本过滤?
  4. 返回的 Web 文件夹WNetEnumResource不是我在创建它们时分配给它们的用户友好名称,而是采用 IP-Address@Port 格式,例如\\nnn.nnn.nnn.nnn@18123. 如何获取 Web 文件夹的用户友好名称?
  5. 脱机的 Web 文件夹根本没有出现,但在 Windows 资源管理器中却出现了。关于获取离线的有什么建议吗?

c# shared-directory network-share web-folders filesystem-browser

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

如何避免异常反序列化无效的枚举项?

为简单起见,我将使用水果显示我的示例代码.实际上我正在做一些更有意义的事情(我们希望).假设我们有一个枚举:

public enum FruitType
{
    Apple,
    Orange,
    Banana
}
Run Code Online (Sandbox Code Playgroud)

一节课:

[Serializable]
public class Fruit
{
    public FruitType FruitType { get; set; }
    public Fruit(FruitType type)
    {
        this.FruitType = type;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们可以对它进行序列化和反序列化.现在,让我们修改枚举,现在它是:

public enum FruitType
{
    GreenApple,
    RedApple,
    Orange,
    Banana
}
Run Code Online (Sandbox Code Playgroud)

反序列化以前序列化的对象时,会出现System.InvalidOperation异常,因为Apple(原始枚举项)无效.该对象不会被反序列化.

我能够解决这个问题的一种方法是在序列化时为类中的FruitType属性赋予Fruit不同的名称,如下所示:

    [XmlElement(ElementName = "Mode")]
    public FruitType FruitType { get; set; }
Run Code Online (Sandbox Code Playgroud)

现在,在反序列化期间,旧属性将被忽略,因为找不到它.我想知道是否有一种方法可以在反序列化期间忽略/跳过无效的枚举项,这样就不会抛出异常并且对象仍然会被反序列化.

c# serialization xml-serialization xml-deserialization deserialization

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