Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HttpListener从网页接收数据_C#_Html - Fatal编程技术网

C# 使用HttpListener从网页接收数据

C# 使用HttpListener从网页接收数据,c#,html,C#,Html,我遇到了一个小问题。我目前正在开发一个程序,在提交表单时必须从网页接收数据 所以我想做的是:当用户按下网页上的submit按钮时,C#程序应该将其拾取并显示在控制台中 我怎么能做到这一点,因为我再也做不到了 我找到了很多例子,但似乎没有一个是有效的。 以下是我使用的示例: 然后我们有了我们的代码 C#代码 public static void StartListening() { HttpListener listener = new Http

我遇到了一个小问题。我目前正在开发一个程序,在提交表单时必须从网页接收数据

所以我想做的是:当用户按下网页上的submit按钮时,C#程序应该将其拾取并显示在控制台中

我怎么能做到这一点,因为我再也做不到了

我找到了很多例子,但似乎没有一个是有效的。 以下是我使用的示例:

然后我们有了我们的代码

C#代码

    public static void StartListening()
    {        

        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;

// this is were i included the SetContent()
                string html = Properties.Resources.index;
                byte[] webPageBuffer = Encoding.UTF8.GetBytes(html);

                response.ContentLength64 = webPageBuffer.Length;
                Stream 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;
                    Stream secondStream = response.OutputStream;                       
                    secondStream.Write(buffer, 0, buffer.Length);
                    secondStream.Close();
                }
            }
        }
    }

    private static void SetPrefixes(HttpListener listener)
    {
        String[] prefixes = new String[] { "http://localhost:8000/", "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>
<head> 
    <title>LocatieScanner</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>Locatiescanner</legend><br/> 
        <form id="searchForm" action="http://localhost:8000/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>
HTML代码

    public static void StartListening()
    {        

        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;

// this is were i included the SetContent()
                string html = Properties.Resources.index;
                byte[] webPageBuffer = Encoding.UTF8.GetBytes(html);

                response.ContentLength64 = webPageBuffer.Length;
                Stream 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;
                    Stream secondStream = response.OutputStream;                       
                    secondStream.Write(buffer, 0, buffer.Length);
                    secondStream.Close();
                }
            }
        }
    }

    private static void SetPrefixes(HttpListener listener)
    {
        String[] prefixes = new String[] { "http://localhost:8000/", "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>
<head> 
    <title>LocatieScanner</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>Locatiescanner</legend><br/> 
        <form id="searchForm" action="http://localhost:8000/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>
可能的问题

问题可能就在这里

                String url = request.RawUrl;
                String[] queryStringArray = url.Split('/');
                String postedtext = GetPostedText(request);
当我通过断点时,我会在
queryStringArray
中看到我想要的URL,但是由于while循环,每次都会重置它,因此我无法获得我想要的数据

另外,
queryStringArray
的长度并不总是相同的


我能得到一些帮助吗?

请尝试将其作为您的html部分:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>jQuery.post demo</title>
  <script src="https://code.jquery.com/jquery-1.10.2.js"></script>
</head>
<body>

<form action="http://localhost:8000/myForm/doSomething" id="searchForm">

    Locatienummer:<input type="text" name="a" placeholder="...">
    <br />
    <br />
    Bonnummer:<input type="text" name="b" placeholder="...">

    <br />
    <br />

    <input type="submit" value="OK">
</form>

  <!-- the result of the search will be rendered inside this div -->
  <div id="result"></div>

    <script type="text/javascript">

        // Attach a submit handler to the form

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

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

            aValue = $form.find("input[name='a']").val(),
            bValue = $form.find("input[name='b']").val(),

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

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

        });

    </script>

</body>
</html>
您可以在C#side中的postedText变量内的框中看到输入的文本

我希望这对你有帮助

编辑:

请注释掉以下行,然后重试:

// this is were i included the SetContent()
string html = Properties.Resources.index;
byte[] webPageBuffer = Encoding.UTF8.GetBytes(html);

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

ouputStream.Flush();

Common.Wait(2000);

评论不用于扩展讨论;这段对话已经结束。