4

我想要做的是创建一个 SocketStreamListener 并连接到它(在本地主机上)。然后连接到它并向它发送消息。非常简单的东西,这一切都在官方演示中完成,但我想理解它并在我自己的应用程序中使用这个逻辑。

问题

我创建了一个新的 Windows Metro C# 应用程序项目,并使用以下代码在我的 MainPage 上创建侦听器:

private void Button_Click(object sender, RoutedEventArgs e)
{
    StreamSocketListener listener = new StreamSocketListener();
    greetingOutput.Text = "Hello, " + nameInput.Text + "!";
}

但我收到此错误:

HelloWorld.exe 中出现“System.UnauthorizedAccessException”类型的异常,但未在用户代码中处理

WinRT 信息:至少需要 InternetClientServer 或 PrivateNetworkClientServer 功能之一来侦听或接收流量

附加信息:访问被拒绝。

如果有这个异常的处理程序,程序可以安全地继续。

不过,相同的代码在官方演示中也有效。

我错过了什么?我究竟做错了什么?

4

1 回答 1

9

您需要根据需要将应用程序配置为需要一项或两项必要功能:

  1. 互联网客户端服务器

    您的 Internet 连接,包括来自 Internet 的未经请求的传入连接 - 该应用程序可以通过防火墙将信息发送到您的计算机或从您的计算机发送信息。如果声明了此功能,则无需声明 internetClient。

  2. 私有网络客户端服务器

    家庭或工作网络——该应用程序可以向您的计算机和同一网络上的其他计算机发送信息或从您的计算机和其他计算机发送信息。

(来自http://msdn.microsoft.com/en-us/library/windows/apps/br211423.aspx上的文档)

有关功能如何工作的更多信息,另请参阅本文:http: //msdn.microsoft.com/en-us/library/windows/apps/hh464936.aspx

互联网和公共网络

internetClient 功能提供通过防火墙对 Internet 和公共网络的出站访问。几乎所有 Web 应用程序都使用此功能。internetClientServer 功能提供通过防火墙对 Internet 和公共网络的入站和出站访问。

家庭和工作网络

privateNetworkClientServer 功能提供通过防火墙对家庭和工作网络的入站和出站访问。此功能通常用于跨局域网 (LAN) 进行通信的游戏,以及跨各种本地设备共享数据的应用程序。如果您的应用指定了musicLibrary、picturesLibrary 或videoLibrary,则无需使用此功能来访问家庭组中的相应库。

您需要在包清单中声明您的应用需要(因此可以访问)哪些功能。这是有关如何执行此操作的分步指南:http: //msdn.microsoft.com/en-us/library/windows/apps/br211477.aspx

您可以使用 Visual Studio 中的清单设计器来编辑这些功能。只需在名为的解决方案中找到并打开该文件,package.appxmanifestManifest Designer 就会打开。

应用清单设计器

选择功能选项卡和您的应用所需的网络相关功能,您应该一切顺利。

链接到有关 App Manifest Designer 的文档:http: //msdn.microsoft.com/en-us/library/windows/apps/br230259 (v=vs.110).aspx

关于最后一段

如果有这个异常的处理程序,程序可以安全地继续。

它只是说您可以使用StreamSocketListenertry-catch 块包装您的代码。如果您想在应用程序中优雅地处理缺失的功能,这是一件好事:

private void Button_Click(object sender, RoutedEventArgs e)
{ 
    try 
    {
         StreamSocketListener listener = new StreamSocketListener();
         greetingOutput.Text = "Hello, " + nameInput.Text + "!";
    } 
    catch(UnauthorizedAccessException exc) 
    {
         // Act on the missing capability. Log it and/or warn the user.
    }
}
于 2012-07-30T16:08:22.723 回答