StreamSocketListener访问被拒绝

时间:2012-07-30 16:02:06

标签: c# .net sockets microsoft-metro

我想要做的是创建一个SocketStreamListener并连接到它(在localhost上)。然后连接到它并发送消息。非常简单的东西,它都完成here in an official demo但我想理解它并在我自己的应用程序中使用这个逻辑。

问题

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

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

但是我收到了这个错误:

  

发生了'System.UnauthorizedAccessException'类型的异常   HelloWorld.exe但未在用户代码中处理

     

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

     

其他信息:访问被拒绝。

     

如果存在此异常的处理程序,则程序可能是安全的   继续进行。

相同的代码可以在官方演示中使用。

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

1 个答案:

答案 0 :(得分:6)

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

  1. internetClientServer

      

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

  2. privateNetworkClientServer

      

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

  3. (来自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,则无需使用此功能来访问主页组中的相应库。

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

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

    App Manifest Designer

    选择功能标签以及您的应用所需的网络相关功能,您应该好好去。

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

    关于最后一段

      

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

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

    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.
        }
    }