我正在尝试将XML代码片段发送到我的本地主机服务器。我已经能够成功连接并(我认为)成功发送代码段。但是,当我运行我的程序时,我得到一个未处理的 WebException。例外详情全文如下:
System.Net.WebException was unhandled
Message=The server committed a protocol violation. Section=ResponseStatusLine
Source=System
StackTrace:
at System.Net.HttpWebRequest.GetResponse()
at Automation_Algorithm.AutomationForm.cmdStart_Click(Object sender, EventArgs e) in C:UsersConzMdocumentsvisual studio 2010ProjectsAutomation AlgorithmAutomation AlgorithmAutomationForm.vb:line 29
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
at Automation_Algorithm.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81
我的代码(从第 11 行开始):
Private Sub cmdStart_Click(sender As System.Object, e As System.EventArgs) Handles cmdStart.Click
Dim requestNF As WebRequest = WebRequest.Create("http://127.0.0.1:4096")
requestNF.Method = "POST"
Dim datastring As String
Dim getdata =
<?xml version='1.0' encoding='ISO-8859-1'?>
<MLCommandSet>
<info/>
</MLCommandSet> '/
datastring = "<?xml version='1.0' encoding='ISO-8859-1'?>" & vbNewLine & getdata.ToString()
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(datastring)
requestNF.ContentLength = byteArray.Length
requestNF.ContentType = "text/xml"
Dim dataStream As Stream = requestNF.GetRequestStream()
dataStream.Write(byteArray, 0, byteArray.Length)
txtXMLOutFF.AppendText(getdata.ToString & vbNewLine)
dataStream.Close()
Dim responseNF As Object = requestNF.GetResponse.GetResponseStream '<---breaks here'
Console.WriteLine(CType(responseNF, HttpWebResponse).StatusDescription.ToString)
txtXMLInFF.Text = CType(responseNF, HttpWebResponse).StatusDescription.ToString
dataStream = responseNF.GetResponseStream
Dim readerNF As New StreamReader(dataStream)
Dim responseFromServerNF As String = readerNF.ReadToEnd
Console.WriteLine(responseFromServerNF)
txtXMLInFF.AppendText(responseFromServerNF.ToString & vbNewLine)
readerNF.Close()
dataStream.Close()
responseNF.Close()
End Sub
有人可以为我阐明这一点吗?
虽然我仍然没有实现与应用程序通信的预期目标,但我确实发现问题是通信是通过原始TCP/IP消息进行的,而不是像我假设的那样通过XML或HTTP请求进行的。因此,我想出了一个故障排除清单,以便在收到"服务器协议冲突:部分:响应状态行"错误时运行:
-
将以下代码添加到 app.config 文件:(它允许传递不正确的标头)
<system.net> <settings> <httpWebRequest useUnsafeHeaderParsing = "true"/> </settings> </system.net>
- 如果在清理和重建后这不起作用,则您连接到的服务器可能未发送 WebRequest 数据。为了测试这一点,我使用了Telnet客户端。
-
要使用Telnet测试数据,请下载并打开Telnet客户端(Windows,我建议PuTTYtel,Unix和其他人通常只需启动其终端/命令提示符并键入
telnet
即可激活)。a) 在相应的字段 (Windows) 中输入您尝试连接的服务器和端口号,或在终端中键入
telnet -o servername:portnumber
并按 Enter 键。(Unix/Linux 风格)b) 当窗口出现时,尝试键入原始查询,仔细记下任何空格或换行符规范。就我而言,我输入了:
<?xml version='1.0' encoding='ISO-8859-1'?> <MLCommandSet> <info/> </MLCommandSet>
,然后按回车键。当我这样做时,我立即看到了我正在寻找的应用程序的输出。
:D但是,如果这不起作用,请在其他地方寻找解决方案,因为我无法进一步帮助您。
希望这有帮助!