【发布时间】:2010-12-30 15:03:09
【问题描述】:
我正在尝试在没有 WSDL 且必须使用 HttpWebRequest 的 .Net Compact Framework 3.5 项目中使用 Web 服务。 我已经在 2 台设备和模拟器上尝试了我的代码,但每次都得到相同的异常,我真的不明白为什么!?
首先,我的代码:
internal void SendSms()
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(@"https://username:password@api.sipgate.net/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();
}
}
在“使用 (Stream stream = req.GetRequestStream())”行中,我得到以下异常,我不知道为什么:
System.Net.WebException {“无法建立网络连接。”}
堆栈跟踪:
在 System.Net.HttpWebRequest.finishGetRequestStream() 在 System.Net.HttpWebRequest.GetRequestStream() 在 SipMSGate.UI.MainFormController.SendSms() 在 SipMSGate.UI.Form1.menuItem1_Click(对象发送者,EventArgs e) 在 System.Windows.Forms.MenuItem.OnClick(EventArgs e) 在 System.Windows.Forms.Menu.ProcessMnuProc(控制 ctlThis,WM wm,Int32 wParam,Int32 lParam) 在 System.Windows.Forms.Form.WnProc(WM wm,Int32 wParam,Int32 lParam) 在 System.Windows.Forms.Control._InternalWnProc(WM wm,Int32 wParam,Int32 lParam) 在 Microsoft.AGL.Forms.EVL.EnterMainLoop(IntPtr hwnMain) 在 System.Windows.Forms.Application.Run(Form fm) 在 SipMSGate.Program.Main()
状态:
System.Net.WebExceptionStatus.ConnectFailure
我可以在设备和模拟器上使用 Internet Explorer,所以我认为我有互联网连接。
知道我的代码出了什么问题或忘记了什么吗?
比你好多了
twickl
现在这里是完整的代码,包括 Yakimych 的代码,它在 2 个设备和模拟器图像上给出了异常,它们都连接到 Internet:
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>01234556789</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:pass@api.sipgate.net/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 中的 (s) 导致了问题?您可能需要先验证证书,然后才能创建此类连接。
-
完全不相关,但您不需要手动设置
req.ContentLength。 -
嗯,只要我不设置内容长度,我就会得到一个异常,说内容长度不能为-1?!
标签: c# windows windows-mobile compact-framework httpwebrequest