StreamSocketListener访问被拒绝

dar*_*ren 2 .net c# sockets microsoft-metro

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

问题

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

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

但我得到这个错误:

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

WinRT信息:监听或接收流量至少需要InternetClientServer或PrivateNetworkClientServer功能中的一个

其他信息:访问被拒绝.

如果存在此异常的处理程序,则可以安全地继续该程序.

相同的代码在官方演示中工作.

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

Cha*_*tål 7

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

  1. internetClientServer

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

  2. privateNetworkClientServer

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

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

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

互联网和公共网络

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

家庭和工作网络

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

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

您可以使用Visual Studio中的Manifest Designer来编辑这些功能.只需在您的解决方案中找到并打开该文件,即可打开package.appxmanifestManifest Designer.

App Manifest 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.
    }
}
Run Code Online (Sandbox Code Playgroud)