尝试在不存在的网络连接上执行操作,错误代码1229。

12

我正在开发一个简洁易懂的HttpListener,但是突然出现了以下异常:

尝试对不存在的网络连接进行操作。

我花了几个小时寻找解决方案,但没有找到。每当我从网页提交数据到HttpListener时,代码就会崩溃。 请问有人能够向我解释如何解决这个问题吗?

下面是代码:

C#

public static void StartListening()
    {
        
        Stream ouputStream;
        
        
        HttpListener listener = new HttpListener();
        SetPrefixes(listener);
        
        if (listener.Prefixes.Count > 0)
        {
            listener.Start();
           
            Console.WriteLine("HttpClient Started");  

            while(true)
            {
                HttpListenerContext context = listener.GetContext();
                HttpListenerRequest request= context.Request;
                HttpListenerResponse response = context.Response;
               
                string html = Properties.Resources.index;
                byte[] webPageBuffer = Encoding.UTF8.GetBytes(html);
                                    
                response.ContentLength64 = webPageBuffer.Length;
                ouputStream = response.OutputStream;
                ouputStream.Write(webPageBuffer, 0, webPageBuffer.Length);

                ouputStream.Flush();

                Common.Wait(2000);  
                                 
                String url = request.RawUrl;
                String[] queryStringArray = url.Split('/');
                String postedtext = GetPostedText(request);                   

                byte[] buffer = null;
                
                // Lots of if statements because a switch would not work here.
                if(queryStringArray[0] == "myForm")
                {
                    buffer = System.Text.Encoding.UTF8.GetBytes("I recieved myForm");
                }
                if(queryStringArray[1] == "doSomething")
                {
                    buffer = System.Text.Encoding.UTF8.GetBytes("I recieved doSomething");
                }
                if(buffer != null)
                {
                    response.AddHeader("Cache-Control", "no-cache");
                    response.AddHeader("Acces-Control-Allow-Origin","*");

                    response.ContentLength64 = buffer.Length;
                    ouputStream = response.OutputStream;
                    ouputStream.Write(buffer, 0, buffer.Length);
                    ouputStream.Close();
                }
            }
        }
    }
               
    private static void SetContext(HttpListenerContext context, Stream ouputStream)
    {
        // De GetContext methode blokkeert terwijl die wacht op een aanvraag(request)
        
        
    }

    private static void SetPrefixes(HttpListener listener)
    {
        String[] prefixes = new String[] { "http://localhost:8100/", "http://192.168.33.28:8000/" };

        int i = 0;

        foreach (string s in prefixes)
        {
            listener.Prefixes.Add(s);
            i++;
        }
    }


    private static string GetPostedText(HttpListenerRequest request)
    {
        string recievedText;

        using(StreamReader reader = new StreamReader(request.InputStream, request.ContentEncoding))
        {
            recievedText= reader.ReadToEnd();
        }

        if (recievedText != "")
        {
            Console.WriteLine("{0} RECIEVED: " + recievedText, DateTime.Now);
        }

        return recievedText;
    }

HTML

<html>
    <head> 
        <title>http</title>
        <meta charset="utf-8">
        <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
        <style>

            body{
        font-size: 12px;
        font-family: Arial;
        }

        legend{
            font-weight: bold;
            font-size: 14px !important;
        }


        fieldset{
            width:200px;
            margin: 0;
            position: absolute;
            top: 50%;
            left: 50%;
            margin-right: -50%;
            transform: translate(-50%, -50%) }

        .wrapper{
            width: 100%;
        }

        </style>


        <script language="javascript">

        //<!-- Create variable timer -->
            var timer;


        //<!-- Create Fucntion CheckOne -->
        /* 
            Wannneer de functie aangroepen word, word eerst de timeout van de variable timer geleegd.
            Daarna word er een timeout ingesteld van 2000 (2sec). Die timeout wordt ingeschakeld nadat het textveld niet meer actief beschouwd word(niet meer gebruikt word, de focus blijft wel op het veld.).
            Na die 2 seconden krijgt de volgende textbox de focus met de zelfde manier maar onder een andere functie.
            Zodra hier ook de 2 seconden om zijn verspringt de focus weer maar nu naar een sumbit (verzenden) knop. Dit is gedaan omdat je dan makkelijk op een OK knop kan drukken op het apparaat.
        */

            function CheckOne() {
                 clearTimeout(timer)
                 timer = setTimeout(function(){
                     document.getElementById("two").focus();
                     //clearTimeout(timer);
                 }, 750)
            }

            function CheckTwo(){
                clearTimeout(timer);
                timer = setTimeout(function(){
                     document.getElementById("sub").focus();
                 }, 750)
            }


        </script> 
        



    </head> 

    <body> 

    <div class="wrapper"> 
        <fieldset> 
            <legend>HttpListener </legend><br/> 
            <form id="searchForm" action="http://localhost:8100/myForm/doSomething" >
                Locatienummer: <br />
                <input type="text" id="one" onkeyup="CheckOne()" name="locatienummer"><br />
                Bonnummer: <br />
                <input type="text" id="two" onkeyup="CheckTwo()" name="bonnummer"><br /><br />
                <input id="sub" type="submit" value="Verzenden" />
            </form> 
        </fieldset> 
    </div> 
    <!-- Include the needed files--> 

        <script>
    $("#searchForm").submit(function (event)
    {
        // Stop form from submitting normally
        event.preventDefault();

        // Get some values from elements on the page:
        var $form = $(this),

        locatieValue = $form.find("input[name='locatienummer']").val(),
        bonValue = $form.find("input[name='bonnummer']").val(),

        url = $form.attr("action");

        // Send the data using post
        $.post(url, { a: locatieValue, b: bonValue });

    });
        </script>

    </body> 
</html>

2
检查防病毒软件或防火墙是否阻止了访问。还要检查 https://support.microsoft.com/en-us/kb/899268 和 https://dev59.com/9Ws05IYBdhLWcg3wG-RR。 - Amit
我已经检查了我的防火墙和杀毒软件,但我认为问题在代码中。1229与TCP协议有关,我遇到了完全相同的问题。 - Collin
这个异常是在哪一行发生的? - selkathguy
1
我注意到outputStream没有被关闭。在StartListening函数中,你两次分配了outputStream,但它只被关闭了一次,我不确定这是否解决了你的问题。但这是你应该考虑的事情。 - Suresh Kumar Veluswamy
你找到解决方案了吗?我也有同样的问题... - Davor
2个回答

13

基本上,你的问题是由于在完成请求流处理之前向响应流写入数据而触发的。如果你重新排列代码,在开始尝试写入响应之前处理请求,就能解决这个问题。可能需要重新审视代码,但基本上将其更改为以下内容将有所帮助:

HttpListenerContext context = listener.GetContext();
HttpListenerRequest request= context.Request;
HttpListenerResponse response = context.Response;

// Process Request **First**
String url = request.RawUrl;
String[] queryStringArray = url.Split('/');
String postedtext = GetPostedText(request);                   

// Process Response **Second**
string html = Properties.Resources.index;
byte[] webPageBuffer = Encoding.UTF8.GetBytes(html);

response.ContentLength64 = webPageBuffer.Length;
ouputStream = response.OutputStream;
ouputStream.Write(webPageBuffer, 0, webPageBuffer.Length);

ouputStream.Flush();

/* etc */

2
在我的情况下,问题不是顺序(可能!)。由于我的应用程序资源有限,每次只能处理一个请求。每个处理需要大约10秒钟,如果在此期间客户端断开连接,则没有输出响应。我的假设是正确的吗?为了确保我可以写入流,我在代码中添加了if(outputStream.CanWrite) ,就在写入之前的那一行。 - Milad

0
今天我遇到了同样的异常,原因是在尝试写入 HttpResponseStream 之前停止了监听器。诀窍是在获取监听器上下文后立即编写响应。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接