HttpListener在发布模式下崩溃

时间:2017-07-20 13:28:42

标签: c# xamarin.android httplistener

重新创建问题
1.创建Android应用程序
2.安装Nito.AsyncEx.Context
3.添加以下代码
4.设置释放模式
5.部署代码
6.启动应用程序(并观看它的刻录!它在我的10.1" Marshmallow...模拟器和Samsung Galaxy Note 10.1上崩溃了

using Android.App;
using Android.Widget;
using Android.OS;
using System.Threading.Tasks;
using System.Net;
using System.Text;
using Nito.AsyncEx;

namespace App1
{
    [Activity(Label = "App1", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        private readonly HttpListener listener = new HttpListener();

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            var thread = new System.Threading.Thread(RunThread);
            thread.Start();
        }

        void RunThread()
        {
            AsyncContext.Run(() => Run()); //Exception in release mode
            //Task.Run(Run); //Silent exception in release mode
        }

        protected async Task Run()
        {
            listener.Prefixes.Add("http://localhost:8082/");
            listener.Start();
            while (true)
            {
                var context = await listener.GetContextAsync();
                var data = Encoding.UTF8.GetBytes("<html><body>Hello world</body></html>");
                context.Response.OutputStream.Write(data, 0, data.Length);
                context.Response.Close();
            }
        }
    }
}

我得到以下异常:

E/mono    (29964): Unhandled Exception:
E/mono    (29964): System.Net.Sockets.SocketException (0x80004005): mono-io-layer-error (10013)
E/mono    (29964):   at System.Net.Sockets.Socket..ctor (System.Net.Sockets.AddressFamily addressFamily, System.Net.Sockets.SocketType socketType, System.Net.Sockets.ProtocolType protocolType) [0x00069] in <12894373fb4d403880bd3e387a4ef038>:0
E/mono    (29964):   at System.Net.EndPointListener..ctor (System.Net.HttpListener listener, System.Net.IPAddress addr, System.Int32 port, System.Boolean secure) [0x0003b] in <12894373fb4d403880bd3e387a4ef038>:0
E/mono    (29964):   at System.Net.EndPointManager.GetEPListener (System.String host, System.Int32 port, System.Net.HttpListener listener, System.Boolean secure) [0x0009d] in <12894373fb4d403880bd3e387a4ef038>:0
E/mono    (29964):   at System.Net.EndPointManager.AddPrefixInternal (System.String p, System.Net.HttpListener listener) [0x0005e] in <12894373fb4d403880bd3e387a4ef038>:0
E/mono    (29964):   at System.Net.EndPointManager.AddListener (System.Net.HttpListener listener) [0x0009c] in <12894373fb4d403880bd3e387a4ef038>:0
E/mono    (29964):   at System.Net.HttpListener.Start () [0x0000f] in <12894373fb4d403880bd3e387a4ef038>:0
...

1 个答案:

答案 0 :(得分:2)

要打开套接字,您的应用程序需要INTERNET权限。将以下行添加到AndroidManifest.xml文件中:

<uses-permission android:name="android.permission.INTERNET" />