此HttpWebRequest / HttpWebResponse代码有什么问题(为什么将其视为“不良”请求(400))? [英] What is wrong with this HttpWebRequest/HttpWebResponse code (why is it considered a "bad" request (400))?

查看:585
本文介绍了此HttpWebRequest / HttpWebResponse代码有什么问题(为什么将其视为“不良”请求(400))?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基于来自( 根级别的数据无效。第1行,位置1。



这是我在客户端中正在做的事情:

  WebRequest req = WebRequest.Create (uri); 
req.Method =发布;
req.ContentType = text / plain; charset = utf-8;
byte [] encodeBytes = Encoding.UTF8.GetBytes(data);

ContentType应该为 application / xml还是 application / x-www-form-urlencoded(或其他)?
和/或Encoding应该不是UTF8吗?



UPDATE 18



我注意到C:\用户\粘土\文档\IISExpress\TraceLogFiles\,我得到 403.14:

 <?xml version = 1.0 encoding = UTF-8吗? 
<?xml-stylesheet type ='text / xsl'href ='freb.xsl'?>
<!-从url =(0014)about:internet->保存
< failedRequest url = http:// localhost:21609 /
siteId = 40
appPoolId = Clr4IntegratedAppPool
processId = 1572
动词= GET
remoteUserName =
userName =
tokenUserName = SSCS\clay
authenticationType = anonymous
activityId = { 00000000-0000-0000-0200-0080060000EB}
failureReason = STATUS_CODE
statusCode = 200
triggerStatusCode = 403.14
timeTaken = 904
xmlns:freb = http://schemas.microsoft.com/win/2006/06/iis/freb
>

根据.

解决方案

It could, frankly, be a number of things. If the service is hosted on IIS, and you have IE, then, being a REST service, navigate to that URI, and you should get a 400.xx error. The xx part is clarified here


Based on the info from this MS link, I've got the following code in a Windows CE / Compact Framework app which calls a REST method in a Web API server app:

public static string SendXMLFile2(string uri, string data)
{
    //TODO: Remove below after testing
    String s = data.Substring(0, 128);
    MessageBox.Show(String.Format("data length is {0}, uri is {1}, first part is {2}", data.Length, uri, s));
    //TODO: Remove above after testing

    HttpWebRequest myHttpWebRequest=(HttpWebRequest)WebRequest.Create(uri);
    myHttpWebRequest.AllowWriteStreamBuffering=false;
    myHttpWebRequest.Method="POST";
    UTF8Encoding encodedData = new UTF8Encoding();
    //ASCIIEncoding encodedData=new ASCIIEncoding();
    byte[]  byteArray=encodedData.GetBytes(data);
    //myHttpWebRequest.ContentType="application/x-www-form-urlencoded";
    myHttpWebRequest.ContentType = "application/xml";
    myHttpWebRequest.ContentLength=byteArray.Length;
    Stream newStream=myHttpWebRequest.GetRequestStream();
    newStream.Write(byteArray,0,byteArray.Length);
    newStream.Close();
    HttpWebResponse myHttpWebResponse=(HttpWebResponse)myHttpWebRequest.GetResponse();
    return myHttpWebResponse.StatusDescription;
}

What I see is:

...and then I get, "The remote server returned an error: (400) Bad Request." The breakpoint in my REST method (on the server) is not even reached when this exception is thrown/returned.

Why? What do I have to change in the code to get the "bad" request to be considered "good"?

UPDATE

To answer mrchief, here's the server code:

[Route("api/inventory/sendXML/{userId}/{pwd}/{filename}")] 
public async void SendInventoryXML(String userId, String pwd, String fileName)
{
    XDocument doc = XDocument.Load(await Request.Content.ReadAsStreamAsync());
    String saveLoc = String.Format(@"C:\HDP\{0}.xml", fileName);
    doc.Save(saveLoc);
}

Yes, I'm ignoring userId and pwd for now.

UPDATE 2

Plugging this:

http://192.168.125.50:21608/api/inventory/sendXML/duckbilled/platypus/INV_bla.xml

...into Postman, I get:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML>
    <HEAD>
        <TITLE>Bad Request</TITLE>
        <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii">
        </HEAD>
        <BODY>
            <h2>Bad Request - Invalid Hostname</h2>
            <hr>
                <p>HTTP Error 400. The request hostname is invalid.</p>
            </BODY>
        </HTML>

??? This same uri works fine when I call it from a Winforms app created in Visual Studio 2013. Well, actually, I use localhost instead there. I get the same response as above if I use the host name instead of the IP Address. But if I use localhost from PostMan:

http://localhost:21608/api/inventory/sendXML/duckbilled/platypus/INV_bla.xml

I get:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html
    xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>IIS 8.0 Detailed Error - 404.0 - Not Found</title>
        <style type="text/css">
            <!-- 
body{margin:0;font-size:.7em;font-family:Verdana,Arial,Helvetica,sans-serif;} 
code{margin:0;color:#006600;font-size:1.1em;font-weight:bold;} 
.config_source code{font-size:.8em;color:#000000;} 
pre{margin:0;font-size:1.4em;word-wrap:break-word;} 
ul,ol{margin:10px 0 10px 5px;} 
ul.first,ol.first{margin-top:5px;} 
fieldset{padding:0 15px 10px 15px;word-break:break-all;} 
.summary-container fieldset{padding-bottom:5px;margin-top:4px;} 
legend.no-expand-all{padding:2px 15px 4px 10px;margin:0 0 0 -12px;} 
legend{color:#333333;;margin:4px 0 8px -12px;_margin-top:0px; 
font-weight:bold;font-size:1em;} 
a:link,a:visited{color:#007EFF;font-weight:bold;} 
a:hover{text-decoration:none;} 
h1{font-size:2.4em;margin:0;color:#FFF;} 
h2{font-size:1.7em;margin:0;color:#CC0000;} 
h3{font-size:1.4em;margin:10px 0 0 0;color:#CC0000;} 
h4{font-size:1.2em;margin:10px 0 5px 0; 
}#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS",Verdana,sans-serif; 
 color:#FFF;background-color:#5C87B2; 
}#content{margin:0 0 0 2%;position:relative;} 
.summary-container,.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;} 
.content-container p{margin:0 0 10px 0; 
}#details-left{width:35%;float:left;margin-right:2%; 
}#details-right{width:63%;float:left;overflow:hidden; 
}#server_version{width:96%;_height:1px;min-height:1px;margin:0 0 5px 0;padding:11px 2% 8px 2%;color:#FFFFFF; 
 background-color:#5A7FA5;border-bottom:1px solid #C1CFDD;border-top:1px solid #4A6C8E;font-weight:normal; 
 font-size:1em;color:#FFF;text-align:right; 
}#server_version p{margin:5px 0;} 
table{margin:4px 0 4px 0;width:100%;border:none;} 
td,th{vertical-align:top;padding:3px 0;text-align:left;font-weight:normal;border:none;} 
th{width:30%;text-align:right;padding-right:2%;font-weight:bold;} 
thead th{background-color:#ebebeb;width:25%; 
}#details-right th{width:20%;} 
table tr.alt td,table tr.alt th{} 
.highlight-code{color:#CC0000;font-weight:bold;font-style:italic;} 
.clear{clear:both;} 
.preferred{padding:0 5px 2px 5px;font-weight:normal;background:#006633;color:#FFF;font-size:.8em;} 
-->
        </style>
    </head>
    <body>
        <div id="content">
            <div class="content-container">
                <h3>HTTP Error 404.0 - Not Found</h3>
                <h4>The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.</h4>

...??? Is it just because this is a POST that is supposed to have an XML file attached, and because it's not there, it gets consumed with confusion?

UPDATE 3

I see the "." in "INV_bla.xml" was confusing PostMan. If I remove it, so that the URI is "http://localhost:21609/api/inventory/sendXML/duckbilled/platypus/INV_bla", I get instead a 500 err msg and:

<!DOCTYPE html>
<html>
    <head>
        <title>Root element is missing.</title>
        <meta name="viewport" content="width=device-width" />
        <style>
         body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} 
         p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
         b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
         H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
         H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
         pre {font-family:"Consolas","Lucida Console",Monospace;font-size:11pt;margin:0;padding:0.5em;line-height:14pt}
         .marker {font-weight: bold; color: black;text-decoration: none;}
         .version {color: gray;}
         .error {margin-bottom: 10px;}
         .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }
         @media screen and (max-width: 639px) {
          pre { width: 440px; overflow: auto; white-space: pre-wrap; word-wrap: break-word; }
         }
         @media screen and (max-width: 479px) {
          pre { width: 280px; }
         }
        </style>
    </head>
    <body bgcolor="white">
        <span>
            <H1>Server Error in '/' Application.
                <hr width=100% size=1 color=silver>
                </H1>
                <h2>
                    <i>Root element is missing.</i>
                </h2>
            </span>
            <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">
                <b> Description: </b>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.


                <br>
                    <br>
                        <b> Exception Details: </b>System.Xml.XmlException: Root element is missing.
                        <br>
                            <br>
                                <b>Source Error:</b>
                                <br>
                                    <br>
                                        <table width=100% bgcolor="#ffffcc">
                                            <tr>
                                                <td>
                                                    <code>
                                                        <pre>

Line 29:         public async void SendInventoryXML(String userId, String pwd, String fileName)
Line 30:         {

                                                            <font color=red>Line 31:             XDocument doc = XDocument.Load(await Request.Content.ReadAsStreamAsync());
</font>Line 32:             String saveLoc = String.Format(@&quot;C:\HDP\{0}.xml&quot;, fileName);
Line 33:             doc.Save(saveLoc);
                                                        </pre>
                                                    </code>
                                                </td>
                                            </tr>
                                        </table>
                                        <br>
                                            <b> Source File: </b> c:\Project\git\CStore\HHS.Web\Controllers\InventoryXMLController.cs
                                            <b> &nbsp;&nbsp; Line: </b> 31

                                            <br>
                                                <br>
                                                    <b>Stack Trace:</b>
                                                    <br>
                                                        <br>
                                                            <table width=100% bgcolor="#ffffcc">
                                                                <tr>
                                                                    <td>
                                                                        <code>
                                                                            <pre>

[XmlException: Root element is missing.]
   System.Xml.XmlTextReaderImpl.Throw(Exception e) +69
   System.Xml.XmlTextReaderImpl.ParseDocumentContent() +305
   System.Xml.XmlTextReaderImpl.Read() +213
   System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) +44
   System.Xml.Linq.XDocument.Load(Stream stream, LoadOptions options) +57
   System.Xml.Linq.XDocument.Load(Stream stream) +6
   HHS.Web.Controllers.&lt;SendInventoryXML&gt;d__0.MoveNext() in c:\Project\git\CStore\HHS.Web\Controllers\InventoryXMLController.cs:31
   System.Runtime.CompilerServices.AsyncMethodBuilderCore.&lt;ThrowAsync&gt;b__0(Object state) +50
   System.Web.&lt;&gt;c__DisplayClass7.&lt;Post&gt;b__6() +15
   System.Web.Util.SynchronizationHelper.SafeWrapCallback(Action action) +91
</pre>
                                                                        </code>
                                                                    </td>
                                                                </tr>
                                                            </table>
                                                            <br>
                                                                <hr width=100% size=1 color=silver>
                                                                    <b>Version Information:</b>&nbsp;Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.18446


                                                                </font>
                                                            </body>
                                                        </html>
                                                        <!-- 
[XmlException]: Root element is missing.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options)
   at System.Xml.Linq.XDocument.Load(Stream stream, LoadOptions options)
   at System.Xml.Linq.XDocument.Load(Stream stream)
   at HHS.Web.Controllers.InventoryXMLController.<SendInventoryXML>d__0.MoveNext() in c:\Project\git\CStore\HHS.Web\Controllers\InventoryXMLController.cs:line 31
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__0(Object state)
   at System.Web.AspNetSynchronizationContext.<>c__DisplayClass7.<Post>b__6()
   at System.Web.Util.SynchronizationHelper.SafeWrapCallback(Action action)
-->

UPDATE 4

With this code (following Brinn's suggestion):

String datta = "<Content></Content>";
String s = SendXMLFile2(uri, datta);
MessageBox.Show(s); // TODO: Remove or comment out after testing

...I still get a 400 error.

UPDATE 5

There is ONE permutation that actually works in Postman to the extent that I reach the breakpoint in the server code (http://localhost:21608/api/inventory/sendXML/duckbill/platypus/INV_bla). However, when I hit F10 to step from the "XDocument doc = ..." line to the "String saveLoc = ..." line, the "Root element is missing" exception is thrown (the one shown above in all its gory glory).

I cannot use that exact same URI in my app, though, as "localhost" is URI-non-grata there.

UPDATE 6

Grasping at straws, I even tried this:

String xmlHeader = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
String crlf = "\r\n";
String datta = "<Content></Content>";
data = xmlHeader + crlf + datta + crlf;
String s = SendXMLFile2(uri, data);

...but the "400 Bad Request" err remains, causing me to rue the day I decided to hang up my spurs.

UPDATE 7

Even when I add an XML file in Postman, I get an error (500 - Internal Server Error):

UPDATE 8

Even with the code straight from the Wigley's mouth (from p. 358 of "Microsoft .NET Compact Framework"):

public static string SendXMLFile2(string uri, string data)
{
    WebRequest req = WebRequest.Create(uri);
    req.Method = "Post";
    req.ContentType = "text/plain; charset=utf-8";
    // Encode the data
    byte[] encodedBytes = Encoding.UTF8.GetBytes(data);
    req.ContentLength = encodedBytes.Length;

    // Write encoded data into request stream
    Stream requestStream = req.GetRequestStream();
    requestStream.Write(encodedBytes, 0, encodedBytes.Length);
    requestStream.Close();

    WebResponse result = req.GetResponse();
    return result.ToString();
}

...I get the "400 - Bad Request" err.

Is it possibly the data - the contents of the XML file - that is throwing a spanner/monkey wrench into the works?

Here's what that looks like (excerpt, with the great middle section elided):

<?xml version="1.0" encoding="utf-8"?>
<Command>
  <INV>
    <line_id>1</line_id>
    <ref_no>valerie</ref_no>
    <upc_code>79997000331</upc_code>
    <description>ffff</description>
    <department>2</department>
    <vendor_id>1</vendor_id>
    <upc_pack_size>1</upc_pack_size>
    <id>79997000331</id>
    <pack_size>1</pack_size>
    <unit_cost>0</unit_cost>
    <unit_list>0</unit_list>
    <unit_qty>9</unit_qty>
    <new_item>-1</new_item>
  </INV>
  <INV>
    <line_id>2</line_id>
    <ref_no>valerie</ref_no>
    <upc_code>81127600412</upc_code>
    <description>SLV EAG FF 100 BX</description>
    <department>2.01</department>
    <vendor_id>1</vendor_id>
    <upc_pack_size>1</upc_pack_size>
    <id>81127600412</id>
    <pack_size>1</pack_size>
    <unit_cost>0</unit_cost>
    <unit_list>0</unit_list>
    <unit_qty>9</unit_qty>
    <new_item>0</new_item>
  </INV>
. . .
<INV>
    <line_id>3277</line_id>
    <ref_no>valerie</ref_no>
    <upc_code>00980000007</upc_code>
    <description>TICTAC</description>
    <department>8.8</department>
    <vendor_id />
    <upc_pack_size>1</upc_pack_size>
    <id>00980000007</id>
    <pack_size>1</pack_size>
    <unit_cost>2</unit_cost>
    <unit_list>3.55</unit_list>
    <unit_qty>0</unit_qty>
    <new_item>0</new_item>
  </INV>
</Command>

UPDATE 9

I get "The remote server returned an error: (400) Bad Request" in my app. Now I do see two interesting entries in Fiddler: There are two 404s that display in Fiddler which have "Host" vals of "localhost:21609" and "localhost:21608" (which relate to the REST calls in question), and "URL" values of /favicon.ico ... ???

What in red blazes is that about? They have a "Body" value of 4,905, a "Caching" value of "private" and "Content-Type" of text/html; charset=utf8

Why is favicon.ico problematic or even considered here?

UPDATE 10

This is Fiddler's "Log" tab contents for my "faked" call to the REST method (using Composer to add my POST URI and upload an XML file):

09:14:20:9657 [WebSocket #1439] Read from Server failed... Object reference not set to an instance of an object.
09:23:19:7275 /Fiddler.CertMaker> Invoking makecert.exe with arguments: -pe -ss my -n "CN=www.google-analytics.com, O=DO_NOT_TRUST, OU=Created by http://www.fiddler2.com" -sky exchange -in DO_NOT_TRUST_FiddlerRoot -is my -eku 1.3.6.1.5.5.7.3.1 -cy end -a sha1 -m 132 -b 09/03/2013 
09:23:20:1296 /Fiddler.CertMaker>64-CreateCert(www.google-analytics.com) => (0).
09:25:45:6411 [Fiddler] No HTTP request was received from (chrome:1384) new client socket, port 4235.
09:25:55:6411 [Fiddler] No HTTP request was received from (chrome:1384) new client socket, port 4241.
09:36:35:6681 [WebSocket #1473] Read from Client returned error: 0
09:36:35:7491 [WebSocket #1473] Read from Server returned error: 0
09:37:45:4031 [WebSocket #1552] Read from Client returned error: 0
09:37:45:4861 [WebSocket #1552] Read from Server returned error: 0
09:37:51:8077 [WebSocket #1575] Read from Client returned error: 0
09:37:51:8877 [WebSocket #1575] Read from Server returned error: 0

I would think maybe the "Object reference not set to an instance of an object" is indicating something in my server code might be the problem - but the key part of that is not even reached...is the fact that I'm calling async/await code in the server a possible cause of my woes???

UPDATE 11

With the only change being that "21609" becomes "21608" in my URL, Fiddler now gives me a "500" ("Internal Server Error") Result (when using 21609 I got "204" Result, but it didn't work).

With this port number, the real "meat and potatoes" code is reached on the server (the async/await code that calls XDocument.Load(), etc.

Fiddler's Inspectors.WebView tab shows me:

Is the problem that this xml does not start off with this line:

<?xml version="1.0" encoding="utf-8"?>

...and is thus not seen as valid/real XML?

UPDATE 12

Nope - even with a file that contains that xml starting line, it fails in the same way...

UPDATE 13

So depending on the client used, I get different results:

From the handheld device, I get a "/favicon.ico" err in Fiddler.
From Fiddler itself (using the "Composer" tab) I get, "Data at the root level is invalid. Line 1, position 1"
From a test Winforms app, the code works (the expected file is populated and saved where it should be) but there is no trace in Fiddler that an HTTP call was even made (there is no entry/evidence for it)...???

UPDATE 14

The server app does have this in Global.asax.cs:

RouteTable.Routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

...so...what's the problem?

UPDATE 15

I notice that I can get trace log files generated by my server app from this location: C:\Users\\Documents\IISExpress\TraceLogFiles\

Looking there, I find the proverbial boatload of information (overload?), such as:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type='text/xsl' href='freb.xsl'?>
<!-- saved from url=(0014)about:internet -->
<failedRequest url="http://localhost:21609/"
   siteId="40"
   appPoolId="Clr4IntegratedAppPool"
   processId="10580"
   verb="GET"
   remoteUserName=""
   userName=""
   tokenUserName="SSCS\clay"
   authenticationType="anonymous"
   activityId="{00000000-0000-0000-1D00-0080020000ED}"
   failureReason="STATUS_CODE"
   statusCode="200"
   triggerStatusCode="403.14"
   timeTaken="62"
   xmlns:freb="http://schemas.microsoft.com/win/2006/06/iis/freb"
   >
   . . .   

What strikes me is the verb "GET" - this is a "POST" not a "GET" - or am I misunderstanding the meaning of the "verb" member?

UPDATE 16

I tested three different ways of calling the REST method, examining what was happening as best as I could using Fiddler and the trace log files that the server creates.

The only successful calling and execution of the server code (receiving the file, and then saving it to disk) occurred with the Winforms (Visual Studio 2013, .NET 4) app.

Here are some details gleaned from those three attempts:

[a] EXE on handheld device: 400 - Bad Request breakpoint in server Controller code NOT reached No activity seen in Fiddler Summary: Fails - server is reached, but returns err msg

Pertinent contents of Log Trace file:
[ no log trace file created ]

[b] Test Winforms app: breakpoint in server Controller code IS reached No activity seen in Fiddler (?!?) Method works - file is created by server code with the data it should have
Summary: works, but is "invisible" to Fiddler

    Pertinent contents of Log Trace file:
    <?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type='text/xsl' href='freb.xsl'?>
<!-- saved from url=(0014)about:internet -->
<failedRequest url="http://localhost:21608/api/inventory/sendXML/duckbill/Platypus/DSD_42314_3_20140310140842828" siteId="41" appPoolId="Clr4IntegratedAppPool" processId="8916"
               verb="POST"
               remoteUserName=""
               userName=""
               tokenUserName="NRBQ\clay"
               authenticationType="anonymous"
               activityId="{00000000-0000-0000-5D00-0080000000F6}"
               failureReason="STATUS_CODE"
               statusCode="204"
               triggerStatusCode="204"
               timeTaken="3666"
               xmlns:freb="http://schemas.microsoft.com/win/2006/06/iis/freb"
               >

[c] Fiddler "Composer" breakpoint in server Controller code IS reached Activity IS seen in Fiddler Result = 500 ("Internal Server Error") Summary: Gets further than the handheld, but fails

    Pertinent contents of Log Trace file:
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type='text/xsl' href='freb.xsl'?>
<!-- saved from url=(0014)about:internet -->
<failedRequest url="http://localhost:21608/api/inventory/sendXML/duckbill/platypus/INV_bla"
               siteId="41"
               appPoolId="Clr4IntegratedAppPool"
               processId="8916"
               verb="POST"
               remoteUserName=""
               userName=""
               tokenUserName="NRBQ\clay"
               authenticationType="anonymous"
               activityId="{00000000-0000-0000-4800-0080060000F6}"
               failureReason="STATUS_CODE"
               statusCode="500"
               triggerStatusCode="204"
               timeTaken="2964"
               xmlns:freb="http://schemas.microsoft.com/win/2006/06/iis/freb"
               >

UPDATE 17

Could it be that my encoding is wrong? It seems that might be the case, based on what I read here when researching the err msg I get ("Data at the root level is invalid. Line 1, position 1.")

This is what I'm doing in the client:

WebRequest req = WebRequest.Create(uri);
req.Method = "Post";
req.ContentType = "text/plain; charset=utf-8";
byte[] encodedBytes = Encoding.UTF8.GetBytes(data);

Should ContentType be "application/xml" or "application/x-www-form-urlencoded" (or something else) instead? and/or should Encoding be something other than UTF8?

UPDATE 18

I noticed in C:\Users\clay\Documents\IISExpress\TraceLogFiles\ that I was getting a "403.14":

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type='text/xsl' href='freb.xsl'?>
<!-- saved from url=(0014)about:internet -->
<failedRequest url="http://localhost:21609/"
               siteId="40"
               appPoolId="Clr4IntegratedAppPool"
               processId="1572"
               verb="GET"
               remoteUserName=""
               userName=""
               tokenUserName="SSCS\clay"
               authenticationType="anonymous"
               activityId="{00000000-0000-0000-0200-0080060000EB}"
               failureReason="STATUS_CODE"
               statusCode="200"
               triggerStatusCode="403.14"
               timeTaken="904"
               xmlns:freb="http://schemas.microsoft.com/win/2006/06/iis/freb"
               >

Which, according to this and more specifically this indicates "Directory listing denied."

Thinking this may be the crux of the problem, I researched what to do about a 403.14, and I followed Method 1 here, which is entitled "Add a default document (Recommended)" but actually contains the steps to "Enable the Directory Browsing feature in IIS"

But I still get the same triggerStatusCode ("403.14") in C:\Users\clay\Documents\IISExpress\TraceLogFiles\

So I was going to try the other method, too, but I already had a default document, so enable was not an option there (disable was).

Finally, I went with the final option, of updating the IIS Express config:

While that made the web pages look better when running the server (the 403.14 was replaced with a "localhost - /" dir listing), it made no difference when the client app attempted to send the XML file to the server. So, this last changed "fixed" the pages that display in the browser when the server is started, but I'm still seeing the "403.14" problem in the Trace log files when I try to access the server from my client app...???

UPDATE 19

With the latest change (setting the IIS config), the Trace log no longer has the "403.14":

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type='text/xsl' href='freb.xsl'?>
<failedRequest url="http://localhost:21609/"
               . . .
               verb="GET"
               . . .
               failureReason="STATUS_CODE"
               statusCode="200"
               triggerStatusCode="200"
               timeTaken="78"
               xmlns:freb="http://schemas.microsoft.com/win/2006/06/iis/freb"
               >

...so I guess the "400 - Bad Request" error I get from the server when calling it from the client is unrelated to this erstwhile 403.14 error. Note, too, that it the "failedRequest" is some "GET" operation (whereas my failing call from the client is an HttpPost). What is failing here I don't know, as statusCode 200 is, in fact, "OK"

The first time (only) that I start the server (or start and then call the server from the client), I get a 404 for a missing favicon, but that doesn't seem to really be a problem.

UPDATE 20

The solution was to add at a command prompt either this:

netsh http add urlacl url=http://shannon2:80/ user=everyone

...or the same for port 8080 instead of 80.

See Update 5 here.

解决方案

It could, frankly, be a number of things. If the service is hosted on IIS, and you have IE, then, being a REST service, navigate to that URI, and you should get a 400.xx error. The xx part is clarified here

这篇关于此HttpWebRequest / HttpWebResponse代码有什么问题(为什么将其视为“不良”请求(400))?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆