簡體   English   中英

HttpListener在發布模式下崩潰

[英]HttpListener Crashes in Release mode

重現問題
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
...

要打開套接字,您的應用程序需要INTERNET權限。 AndroidManifest.xml下行添加到您的AndroidManifest.xml文件中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM