2012-05-08 2 views
0

.Net WebRequest를 사용하여 양식을 POST하려고합니다. 양식은 XML 필드를 포함합니다. (무엇보다도) 다음 코드를 시도 : reqBody에XML이 포함 된 WebRequest POST 양식?

<
WebRequest req = WebRequest.Create(ctx.SvcUrl); 
req.Method = "POST"; 
req.ContentType = "application/x-www-form-urlencoded"; 
using (var writer = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII)) 
{ 
    string reqBody = "first=<bill/>&last=smith"; //(embedded <>) - 500 Internal Server Error 
    writer.Write(reqBody); 
} 
rsp = req.GetResponse(); 

var strm = rsp.GetResponseStream(); 
var rdr = new StreamReader(strm); 
string input = rdr.ReadToEnd(); 

는> 500 원인 - 내부 서버 오류가 발생했습니다.

인코딩 방법은 무엇입니까? 아니면 여러 부분으로 구성된 양식입니까?

+1

문자열의 '<' and '>'문자를 바꾸려면 > 및 <을 시도하십시오. 트릭을 할 수 있을까요? –

답변

0

요청을 인코딩해야합니다. HttpEncoder 클래스를 사용하십시오. 나는 그것이 더 좋은 모습 생각 나는 무엇을하고 있었는지는 명확하게, 그러나 필요가 없기 때문에

using System.Web.Util; 

WebRequest req = WebRequest.Create(ctx.SvcUrl); 
req.Method = "POST"; 
req.ContentType = "application/x-www-form-urlencoded"; 
using (var writer = new StreamWriter(req.GetRequestStream(), 
    System.Text.Encoding.ASCII)) 
{ 
    var encoder = new HttpEncoder(); 
    string reqBody = String.Format("first={0}&last={1}", 
     encoder.HtmlEncode("<bill/>"), 
     encoder.HtmlEncode("smith")); 
    writer.Write(reqBody); 
} 
rsp = req.GetResponse(); 

var strm = rsp.GetResponseStream(); 
var rdr = new StreamReader(strm); 
string input = rdr.ReadToEnd(); 

나는 String.Format()을 사용했다. HttpEncoder.HtmlEncode()을 먼저 전달하는 경우 문자열 연결을 통해 문자열을 작성할 수도 있습니다. 사용

+0

HttpEncoder는 .NET 4.0 이상에서만 작동합니다. – Coder

+0

.Net 4.0 API가 제대로 작동합니다. 그러나 HtmlEncode는 해결책이 아닌 것 같습니다. 위의 < 문제에 대한 내 의견을 참조하십시오. – Chris

1

봅니다 :

string reqBody = string.Format("first={0}&last={1}", HttpUtility.HtmlEncode("<bill/>"), "smith"); 
+0

모든 .NET 버전에서 작동합니다. – Coder

+0

그건 작동하지 않습니다. '='과'&'는 인코딩되지 않고 그대로 있어야합니다. 이것을 사용하려면 다음을 사용해야합니다 :'string reqBody = "first ="+ HttpUtility.HtmlEncode ("") + "last ="+ HttpUtility.HtmlEncode ("smith")' –

+0

기술적으로''smith ''라는 문자열을 특수 문자를 포함하지 않기 때문에 인코딩 할 필요가 없습니다. 하지만 나중에 값이 변경 될 경우 이름 - 값 쌍의 모든 값을 인코딩하는 것이 좋습니다. –

0

그것은에는 urlencoding 그래서 자신이 문제를 일으킬 수있는 그 일을 자동으로 수행되고있는 것으로 나타났다. 또한 연결하려는 서버에서 인코딩을 처리 할 수 ​​없습니다. 이것은 물을 혼란스럽게 만들고 실패한 것을보기 어렵게 만들었습니다.

결론은 UrlEncoding을 처리하도록 서버를 고정시키는 것입니다.

'cheong00 on Microsoft's Forums'은 자동으로 피하기 위해 TcpClient를 사용합니다. 그러나 인코딩이 있어야합니다.

관련 문제