WSDL이없고 HttpWebRequest를 사용해야하는 .NET Compact Framework 3.5 Project에서 Webservice를 사용하려고합니다. 2 개의 장치와 에뮬레이터에서 코드를 시험해 보았습니다.하지만 매번 동일한 예외가 발생했습니다. 이유는 알지 못합니다..Net CF/HttpWebRequest 및 "WebException이 처리되지 않았습니다."
첫째, 내 코드 : 라인에서
internal void SendSms()
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(@"https://username:[email protected]/RPC2");
req.Method = @"POST";
req.ContentType = @"text/xml";
req.ContentLength = Body.Length;
using (Stream stream = req.GetRequestStream())
using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))
{
writer.Write(Body);
}
using (Stream responseStream = req.GetResponse().GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
{
string result = reader.ReadToEnd();
}
}
"사용 (스트림 스트림 = req.GetRequestStream())"나는 다음과 같은 예외가 나는 이유를 파악 할수 없어 :
시스템 .Net.WebException 은 { "네트워크에 연결을 설정할 수 없습니다."}
스택 트레이스 :
을 System.Net.HttpWebRequest.finishGetRequestSt에서 System.Windows.Forms.MenuItem에서 SipMSGate.UI.Form1.menuItem1_Click에서 SipMSGate.UI.MainFormController.SendSms()에서 System.Net.HttpWebRequest.GetRequestStream() 에서 묶음() (객체 송신자있는 EventArgs E) System.Windows.Forms.Form.WnProc (WM의 WM, INT32의 wParam, INT32의 lParam에서 System.Windows.Forms.Menu.ProcessMnuProc (컨트롤 ctlThis, WM의 WM, INT32의 wParam, INT32의 lParam) 에서 .OnClick (있는 EventArgs E) ) at System.Windows.Forms.Control._InternalWnProc (WM wm, Int32 wParam, Int32 lParam) at Microsoft.AGL.Forms.EVL.EnterMainLoop (IntPtr hwnMain) at System.Windows.Forms.Application.Run (Form fm) at SipMSGate.Program.Main()
개상태 :
System.Net.WebExceptionStatus.ConnectFailure
나는 장치에와 에뮬레이터에서 인터넷 익스플로러를 사용할 수 있습니다, 그래서 내가 인터넷에 연결되어 있다고 생각합니다.
어떤 아이디어가 잘못 되었습니까? 아니면 내 코드에서 잊어 버린 내용입니까?
것보다 훨씬
twickl
다음지금이 장치에 xception 그들 모두가 인터넷에 연결가있는 에뮬레이터 이미지를 제공 Yakimych의 코드를 포함한 전체 코드 :
HTTPS를 사용하는 경우using System.Drawing;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Windows.Forms;
namespace httpreqTest
{
public partial class Form1 : Form
{
private HttpWebRequest _req;
private bool _ignoreCertificateErrors;
private string _errorMessage;
private const string Body =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><methodCall><methodName>samurai.SessionInitiate</methodName><params><param><value><struct><member><name>LocalUri</name><value><string></string></value></member><member><name>RemoteUri</name><value><string></string></value></member><member><name>TOS</name><value><string>text</string></value></member><member><name>Content</name><value><string>This is a Test</string></value></member><member><name>Schedule</name><value><string></string></value></member></struct></value></param></params></methodCall>";
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this._ignoreCertificateErrors = true;
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] byte1 = encoding.GetBytes(Body);
CreateWebRequestObject(@"https://user:[email protected]/RPC2");
_req.Method = @"POST";
_req.ContentType = @"text/xml";
_req.ContentLength = byte1.Length;
using (Stream stream = _req.GetRequestStream())
using (StreamWriter writer = new StreamWriter(stream, Encoding.UTF8))
{
writer.Write(Body);
}
using (Stream responseStream = _req.GetResponse().GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
{
string result = reader.ReadToEnd();
}
}
public bool CreateWebRequestObject(string Url)
{
try
{
this._req = (HttpWebRequest)System.Net.WebRequest.Create(Url);
if (this._ignoreCertificateErrors)
ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();
}
catch (Exception ex)
{
this._errorMessage = ex.Message;
return false;
}
return true;
}
/// <summary>
/// Internal object used to allow setting WebRequest.CertificatePolicy to
/// not fail on Cert errors
/// </summary>
internal class AcceptAllCertificatePolicy : ICertificatePolicy
{
public AcceptAllCertificatePolicy()
{
}
public bool CheckValidationResult(ServicePoint sPoint, X509Certificate cert, WebRequest wRequest, int certProb)
{
// *** Always accept
return true;
}
}
}
}
아마도 문제를 일으키는 것이 https의 (들)일까요? 이러한 연결을 만들기 전에 인증서의 유효성을 검사해야합니다. –
완전히 관련이 없지만'req.ContentLength'를 수동으로 설정할 필요는 없습니다. –
흠, 콘텐츠 길이를 설정하지 않는 한 콘텐츠 길이가 -1이 될 수 없다는 예외가 발생합니다. – CaptnCrash