none
關於HttpListener的問題 RRS feed

  • 問題

  •  

    我遇到了一個 怪異現像

    我是用vb.net開發的
    使用其中  webClient.downLoadData("http://192.168.0.1/xxxxxx")
    xxx的字串有一千多個字
    去跟 java 的webservice 要資料 是成功的

    而我自己用vb.net 中的 httpListener 寫了一個 server
    然後  同樣用一樣的方法去要資料 就是 webClient.downLoadData("http://192.168.0.1/xxxxxx")
    xxx大概 三百個字 就出現exception
    錯誤是 http 400 伺服器錯誤

    我在server端有下中斷點 可是 沒有進入
    我猜可能是 client 會不會 URL 太長  可是  上面可以傳一千多個字
    我才傳 三百個字 就有問題

    不知有解嘛

    2008年7月25日 下午 02:22

解答

  •  tihs 寫信:

    HI,

     

    您可以用您的CLIENT程式連結其他的SERVER, 看看是否可以正常執行, 例如以下就是一個使用HttpListener類別製作Server範例:

    http://msdn.microsoft.com/en-us/library/y7cbb2y2.aspx

     

    tihs

    以下是我 Server端的程式碼

     

    這個server端程式可以work ,若在IE 打上http://127.0.0.1/xxxxx   不超過兩百多個字 就回傳OK 但若 超過 大概二百五十個字就會出現     HTTP 400 - 要求錯誤   ,  我有查過 URL 的限制大概是 2046  ,  我也有在 server端程式下中斷點 若是兩百個字就有進入中斷點 , 若是超過 三百個字 server端程式一點反應都沒有

    我將問題 分成幾個好了

    1. 為何  URL 限制 2046 我才 250個字就感覺傳不出去

    2. 我同事是用 NET.webClient 中 downLoadData 與  java web service 溝通 他就可以傳 一千多個字

        我也用同樣方法(webClient)可以傳大約200字但大概 250個字  確跳出 HTTP 400 的Exception

    3. 可以 有地方說明 HTTP listener 程式 有啥限制 我查了很多資料  範例大概如下

        因為 我要傳資料給這個 server 在網址後 會帶很多資料  所以 才會有這樣的問題 

        是否  HTTP listener 的方式速度 比我用 socket 寫server 會慢很多呢

    4. 幫幫忙了  真的很需要大家的幫忙  煩惱中  無從下手 

    ps:我後來用012345678... 當做參數 所以應該沒有 特殊符號的問題

    Code Snippet

    Imports System.Net

    Public Class Form1

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim listener As HttpListener = New HttpListener
            listener.Prefixes.Add("http://*:8888/")
            listener.Start()

            Do While True
                Application.DoEvents()

                Dim context As HttpListenerContext = listener.GetContext
                Dim request As HttpListenerRequest = context.Request

                Dim response As HttpListenerResponse = context.Response
                Dim responseString As String = "OK"
                Dim buffer As Byte() = System.Text.Encoding.UTF8.GetBytes(responseString)
                response.ContentLength64 = buffer.Length
                Dim output As System.IO.Stream = response.OutputStream
                output.Write(buffer, 0, buffer.Length)
                output.Close()

                Application.DoEvents()


            Loop
        End Sub
    End Class

     

     

    2008年7月26日 下午 01:30
  • HI,

     

    您遇到的是HTTP.SYS的上限, 這是為了預防惡意攻擊所做的設定, 請參考:

    http://support.microsoft.com/kb/820129/zh-tw

     

    建議要傳大量的資料還是利用WEB Service或Socket來做, 另外Server在處理Context時最好利用執行緒來處理, 不要在迴圈中直接處理

     

    tihs

    2008年7月28日 上午 01:30

所有回覆

  • HI,

     

    您可以用您的CLIENT程式連結其他的SERVER, 看看是否可以正常執行, 例如以下就是一個使用HttpListener類別製作Server範例:

    http://msdn.microsoft.com/en-us/library/y7cbb2y2.aspx

     

    tihs

    2008年7月26日 下午 12:14
  •  tihs 寫信:

    HI,

     

    您可以用您的CLIENT程式連結其他的SERVER, 看看是否可以正常執行, 例如以下就是一個使用HttpListener類別製作Server範例:

    http://msdn.microsoft.com/en-us/library/y7cbb2y2.aspx

     

    tihs

    以下是我 Server端的程式碼

     

    這個server端程式可以work ,若在IE 打上http://127.0.0.1/xxxxx   不超過兩百多個字 就回傳OK 但若 超過 大概二百五十個字就會出現     HTTP 400 - 要求錯誤   ,  我有查過 URL 的限制大概是 2046  ,  我也有在 server端程式下中斷點 若是兩百個字就有進入中斷點 , 若是超過 三百個字 server端程式一點反應都沒有

    我將問題 分成幾個好了

    1. 為何  URL 限制 2046 我才 250個字就感覺傳不出去

    2. 我同事是用 NET.webClient 中 downLoadData 與  java web service 溝通 他就可以傳 一千多個字

        我也用同樣方法(webClient)可以傳大約200字但大概 250個字  確跳出 HTTP 400 的Exception

    3. 可以 有地方說明 HTTP listener 程式 有啥限制 我查了很多資料  範例大概如下

        因為 我要傳資料給這個 server 在網址後 會帶很多資料  所以 才會有這樣的問題 

        是否  HTTP listener 的方式速度 比我用 socket 寫server 會慢很多呢

    4. 幫幫忙了  真的很需要大家的幫忙  煩惱中  無從下手 

    ps:我後來用012345678... 當做參數 所以應該沒有 特殊符號的問題

    Code Snippet

    Imports System.Net

    Public Class Form1

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim listener As HttpListener = New HttpListener
            listener.Prefixes.Add("http://*:8888/")
            listener.Start()

            Do While True
                Application.DoEvents()

                Dim context As HttpListenerContext = listener.GetContext
                Dim request As HttpListenerRequest = context.Request

                Dim response As HttpListenerResponse = context.Response
                Dim responseString As String = "OK"
                Dim buffer As Byte() = System.Text.Encoding.UTF8.GetBytes(responseString)
                response.ContentLength64 = buffer.Length
                Dim output As System.IO.Stream = response.OutputStream
                output.Write(buffer, 0, buffer.Length)
                output.Close()

                Application.DoEvents()


            Loop
        End Sub
    End Class

     

     

    2008年7月26日 下午 01:30
  • HI,

     

    1) 用HttpListener類別製作的是Web Server, 不是Web Service, 你同事連的是JAVA WEB SERVICE, 不是WEB SERVER

    2) 傳大量資料用SOCKET比較適合

     

    tihs

    2008年7月27日 上午 02:36
  • 那為何 傳 200多個字 就傳不出去 

    一般URL 限制在2043個字

    那 這個狀況是在client端被檔住 還是被 web server檔住

     

     

    2008年7月27日 上午 03:24
  • HI,

     

    可以貼出您在URL傳了什麼內容嗎? 我可以用您貼的SERVER程式試RUN看看

     

    tihs

    2008年7月27日 上午 04:52
  • HI,

     

    您遇到的是HTTP.SYS的上限, 這是為了預防惡意攻擊所做的設定, 請參考:

    http://support.microsoft.com/kb/820129/zh-tw

     

    建議要傳大量的資料還是利用WEB Service或Socket來做, 另外Server在處理Context時最好利用執行緒來處理, 不要在迴圈中直接處理

     

    tihs

    2008年7月28日 上午 01:30