关于HttpWebRequest请求WebService问题.

henryfan1 2005-08-02 03:30:47
通过HttpWebRequest请求WebService后获取HttpWebResponse出现(403)已禁用的错误.
同一个WebService用MSXML(COM)2.0调用是没问题的.
其实可以使用MSXML,只是不想在.NET里使用非托管代码.
我从MSDN上下载了微软件提供的.NET类(XMLHTTP.XmlHttpRequest)也是同样出现这种问题.
...全文
702 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
autumnlj 2005-08-11
  • 打赏
  • 举报
回复
学习中ing...
henryfan1 2005-08-04
  • 打赏
  • 举报
回复
IE运行是没有任何问题的,所以我才感到奇怪.
HttpWebRequest用于Http Post获取HttpWebResponse是没有任何问题的.
cdo 2005-08-03
  • 打赏
  • 举报
回复
帮你顶下,关注
henryfan1 2005-08-03
  • 打赏
  • 举报
回复
XMLTHTTP.XMLHttpRequest封装了和msxml(COM)一样的方法和属性.
henryfan1 2005-08-03
  • 打赏
  • 举报
回复

#region Public Member: GetResponseXML
#region GetResponseXML Remarks
///---------------------------------------------------------------------------
///Method: GetResponseXML
///<summary> Use to retrieve the response in the form of an XMLDocument
/// <para/>
///</summary>
///<example>
/// <code>
/// public XMLDocument GetResponseXML()
/// </code>
///</example>
/// <returns>XMLDocument</returns>
///
/// <remarks> </remarks>
///
///---------------------------------------------------------------------------
#endregion
public XmlDocument GetResponseXML()
{
try
{
if(lgReadyState==eReadyState.COMPLETED)
{
Stream stream = GetResponseStream();
XmlTextReader reader = new XmlTextReader(stream);
XmlDocument document = new XmlDocument();
document.Load(reader);
reader.Close();
stream.Close();
return document;
}
else
throw new InvalidOperationException("Getting response XML is forbidden at current ReadyState");
}
catch (Exception e)
{
throw new Exception ("Error occurred while retrieving XML response",e);
}
}
#endregion

#region Public Member: GetResponseText
#region GetResponseText Remarks
///---------------------------------------------------------------------------
///Method: GetResponseText
///<summary> Use to retrieve the response in the form of a string
/// <para/>
///</summary>
///<example>
/// <code>
/// public string GetResponseText()
/// </code>
///</example>
/// <returns>string</returns>
///
/// <remarks> </remarks>
///
///---------------------------------------------------------------------------
#endregion
public string GetResponseText()
{
if(lgReadyState==eReadyState.COMPLETED)
{
StreamReader reader = new StreamReader(GetResponseStream());
return reader.ReadToEnd();
}
else
throw new InvalidOperationException("Getting response text is forbidden at current ReadyState");

}
#endregion

#region Public Member: GetResponseBody
#region GetResponseBody Remarks
///---------------------------------------------------------------------------
///Method: GetResponseBody
///<summary> Use to retrieve the response in the form of a byte array
/// <para/>
///</summary>
///<example>
/// <code>
/// public byte[] GetResponseBody()
/// </code>
///</example>
/// <returns>byte[]</returns>
///
/// <remarks> </remarks>
///
///---------------------------------------------------------------------------
#endregion
public byte[] GetResponseBody()
{
if(lgReadyState==eReadyState.COMPLETED)
{
Stream stream = GetResponseStream();
BinaryReader reader = new BinaryReader(stream);
long count = stream.Length;
return reader.ReadBytes((int)count);
}
else
throw new InvalidOperationException("Getting response body is forbidden at current ReadyState");
}
#endregion

#region Public Member: GetResponseStream
#region GetResponseStream Remarks
///---------------------------------------------------------------------------
///Method: GetResponseStream
///<summary> Use to retrieve the response in the form of a IO.Stream
/// <para/>
///</summary>
///<example>
/// <code>
/// public Stream GetResponseStream()
/// </code>
///</example>
/// <returns>Stream</returns>
///
/// <remarks> </remarks>
///
///---------------------------------------------------------------------------
#endregion
public Stream GetResponseStream()
{
if(lgReadyState==eReadyState.COMPLETED)
return lgResponse.GetResponseStream();
else
throw new InvalidOperationException("Getting response stream is forbidden at current ReadyState");
}
#endregion

#region Public Property: GetReadyState
public eReadyState GetReadyState()
{
return lgReadyState;
}
#endregion

#region Private Member: ReqCallback
private void ReqCallback(IAsyncResult ar)
{
HttpWebRequest req = (HttpWebRequest)ar.AsyncState;

Stream stream = req.EndGetRequestStream(ar);
StreamWriter streamW = new StreamWriter(stream);
streamW.Write(lgMsg);
streamW.Close();
stream.Close();
IAsyncResult resp = req.BeginGetResponse(new AsyncCallback(RespCallback), req);
}
#endregion

#region Private Member: RespCallback
private void RespCallback(IAsyncResult ar)
{
HttpWebRequest req = (HttpWebRequest)ar.AsyncState;
lgResponse = (HttpWebResponse)req.EndGetResponse(ar);
lgReadyState = eReadyState.COMPLETED;
EventArgs e = new EventArgs();
OnReadyStatusChange(this,e);
}
#endregion
}
}

henryfan1 2005-08-03
  • 打赏
  • 举报
回复
public void SetRequestHeader(string headerName, string headerValue)
{
try
{
if (lgReadyState != eReadyState.LOADING)
throw new InvalidOperationException("Setting request headers is not allowed at this ReadyState");

switch(headerName)
{
case "Accept":
lgRequest.Accept = headerValue;
break;
case "Connection":
lgRequest.Connection = headerValue;
break;
case "Content-Length":
lgRequest.ContentLength = Convert.ToInt32(headerValue);
break;
case "Content-Type":
lgRequest.ContentType = headerValue;
break;
case "Expect":
lgRequest.Expect = headerValue;
break;
case "Date":
throw new Exception("These headers are set by the system");
case "Host":
throw new Exception("These headers are set by the system");
case "Range":
throw new Exception("This header is set with AddRange");
case "Referer":
lgRequest.Referer = headerValue;
break;
case "Transfer-Encoding":
lgRequest.TransferEncoding = headerValue;
break;
case "User-Agent":
lgRequest.UserAgent = headerValue;
break;
default:
lgRequest.Headers.Add(headerName , headerValue);
break;
}
}
catch(Exception e)
{
throw new Exception ("Error occurred while setting request headers",e);
}
}
#endregion

#region Public Member: GetResponseHeader
#region GetResponseHeader Remarks
///------------------------------------------------------------------------------------------------------
///Method name: GetResponseHeader
///<summary> Retrieves the Response header from the response object.
/// <para/>
///</summary>
///<example>
/// <code>
/// public string GetResponseHeader(string header)
/// </code>
///</example>
/// <returns><string>the header value</string></returns>
/// <param name="header">
/// <see cref="string"/>
/// The name of the header
/// </param>
///
/// <remarks/>
///
///------------------------------------------------------------------------------
#endregion
public string GetResponseHeader(string Header)
{
if(lgReadyState == eReadyState.LOADED || lgReadyState == eReadyState.INTERACTIVE || lgReadyState == eReadyState.COMPLETED)
return lgResponse.GetResponseHeader(Header);
else
throw new InvalidOperationException("Getting Response Headers forbidden at current ReadyState");
}
#endregion

#region Public Member: GetAllResponseHeaders
#region GetAllResponseHeaders Remarks
///------------------------------------------------------------------------------
///Method: GetAllResponseHeaders
///<summary> Retrieves the all of the Response headers from the response object.
/// <para/>
///</summary>
///<example>
/// <code>
/// public string[] GetAllResponseHeaders ()
/// </code>
///</example>
/// <returns><string[]>the headers value</string[]></returns>
///
/// <remarks/>
///
///------------------------------------------------------------------------------
#endregion
public string[] GetAllResponseHeaders()
{
if(lgReadyState == eReadyState.LOADED || lgReadyState == eReadyState.INTERACTIVE || lgReadyState == eReadyState.COMPLETED)
return lgResponse.Headers.AllKeys;
else
throw new InvalidOperationException("Getting Response Headers forbidden at current ReadyState");
}
#endregion

#region Public Member: Send
#region Send Remarks
///---------------------------------------------------------------------------
///Method: Send
///<summary> Sending a message as a string.
/// <para/>
///</summary>
///<example>
/// <code>
/// public void Send(string body)
/// </code>
///</example>
/// <returns>void</returns>
///
/// <remarks></remarks>
///
///-------------------------------------------------------------------------------
#endregion
public void Send(string body)
{
if (lgReadyState != eReadyState.LOADING)
throw new InvalidOperationException("Sending a message is not allowed at this ReadyState");
if (body != null)
{
if(lgbIsAsync)
{
lgMsg = body;
IAsyncResult res = lgRequest.BeginGetRequestStream(new AsyncCallback(ReqCallback),lgRequest);
lgReadyState = eReadyState.LOADED;
}
else
{
StreamWriter stream = new StreamWriter(lgRequest.GetRequestStream(),Encoding.UTF8);
stream.Write(body);
stream.Flush();
stream.Close();
lgResponse = (HttpWebResponse)lgRequest.GetResponse();
lgReadyState = eReadyState.COMPLETED;
}
}
}
#endregion

#region Public Member: Abort
#region Abort Remarks
///---------------------------------------------------------------------------
///Method: Abort
///<summary> Use to abort asynch operation
/// <para/>
///</summary>
///<example>
/// <code>
/// public void Abort()
/// </code>
///</example>
/// <returns>void</returns>
///
/// <remarks> </remarks>
///
///---------------------------------------------------------------------------
#endregion
public void Abort()
{
lgRequest = null;
lgReadyState = eReadyState.UNINITIALIZED;
}
#endregion

#region Public Member: GetStatus
#region GetStatus Remarks
///---------------------------------------------------------------------------
///Method: GetStatus
///<summary> Use to get response status
/// <para/>
///</summary>
///<example>
/// <code>
/// public int GetStatus()
/// </code>
///</example>
/// <returns>int</returns>
///
/// <remarks> </remarks>
///
///---------------------------------------------------------------------------
#endregion
public int GetStatus()
{
if(lgReadyState==eReadyState.COMPLETED)
return (int)lgResponse.StatusCode;
else
throw new InvalidOperationException("Getting response status is forbidden at current ReadyState");
}
#endregion

#region Public Member: GetStatusText
#region GetStatusText Remarks
///---------------------------------------------------------------------------
///Method: GetStatusText
///<summary> Use to get response status description
/// <para/>
///</summary>
///<example>
/// <code>
/// public string GetStatusText()
/// </code>
///</example>
/// <returns>string</returns>
///
/// <remarks> </remarks>
///
///---------------------------------------------------------------------------
#endregion
public string GetStatusText()
{
if(lgReadyState==eReadyState.COMPLETED)
return lgResponse.StatusDescription;
else
throw new InvalidOperationException("Getting response status is forbidden at current ReadyState");
}
#endregion
henryfan1 2005-08-03
  • 打赏
  • 举报
回复
以下是从微软件下载的XMLTHTTP.XMLHttpRequest的类:
{
#region Framework Classes used
using System;
using System.Xml;
using System.Net;
using System.IO;
using System.Text;
#endregion

#region XMLHttpRequest Public Enums
public enum eReadyState: int
{
UNINITIALIZED = 0, //The object has been created but has not been initialized (open has not been called).
LOADING = 1, //The object has been created but the send method has not been called.
LOADED = 2, //The send method has been called and the status and headers are available, but the response is not yet available.
INTERACTIVE = 3, //Some data has been received. You can call responseBody and responseText to get the current partial results.
COMPLETED = 4 //All the data has been received, and the complete data is available in responseBody and responseText.
}
#endregion

public class XMLHttpRequest
{
#region XMLHttpRequest Private members
private HttpWebRequest lgRequest=null;
private HttpWebResponse lgResponse=null;
private bool lgbIsAsync = false;
private const string SOAP_CONTENT_TYPE = "text/xml";
private string lgMsg="";
private eReadyState lgReadyState = eReadyState.UNINITIALIZED;
#endregion

#region XMLHttpRequest Constructor
public XMLHttpRequest()
{
}
#endregion

#region XMLHttpRequest Dispose
public void Dispose()
{
lgRequest = null;
lgResponse = null;
}
#endregion

#region XMLHttpRequest Public Events
public event EventHandler OnReadyStatusChange;
#endregion

#region Public Member: Open
#region Open Remarks
///------------------------------------------------------------------------------------------------------
/// Method name: Open
///<summary> Creates the Request object and sets initial parameters for it.
/// <para/>
///</summary>
///<example>
/// <code>
/// Public public void Open(string method, string url, bool asynch, string user, string password)
/// </code>
///</example>
/// <returns>void</returns>
/// <param name="method">
/// <see cref="string"/>
/// GET/POST/PUT
/// </param>
/// <param name="url">
/// <see cref="string"/>
/// url for the UDDI node
/// </param>
/// <param name="asynch">
/// <see cref="bool"/>
/// Perform synch (false) or asynch (true)
/// </param>
/// <param name="user">
/// <see cref="string"/>
/// </param>
/// <param name="password">
/// <see cref="string"/>
/// </param>
/// <remarks/>
/// </remarks>
///------------------------------------------------------------------------------------------------------
#endregion
public void Open(string Method, string Url, bool Asynch, string User, string Password)
{
// check parameters
if (lgRequest != null)
throw new InvalidOperationException("Connection Already open");
if (Url == "" || Url==null)
throw new ArgumentNullException("URL must be specified");
System.Uri uriObj = new System.Uri(Url);
if (!((uriObj.Scheme == System.Uri.UriSchemeHttp) || (uriObj.Scheme == System.Uri.UriSchemeHttps)))
throw new ArgumentOutOfRangeException("URL Scheme is not http or https");

if (Method==null || (Method.ToUpper()!="POST" && Method.ToUpper()!="GET" && Method.ToUpper()!="PUT" && Method.ToUpper()!="PROPFIND"))
throw new ArgumentOutOfRangeException("Method argument type not defined");

lgbIsAsync = Asynch;

lgRequest = (HttpWebRequest)WebRequest.Create(uriObj);
lgRequest.Method = Method;
lgRequest.ContentType = "text/xml; charset=utf-8";
lgRequest.Credentials = new System.Net.NetworkCredential(User, Password);
uriObj = null;
lgReadyState = eReadyState.LOADING;
}
#endregion

#region Public Member: SetRequestHeader
#region SetRequestHeader Remarks
///------------------------------------------------------------------------------------------------------
///Method name: SetRequestHeader
///<summary> Maps headers settings for the request object
/// <para/>
///</summary>
///<example>
/// <code>
/// public void SetRequestHeader(string headerName, string headerValue)
/// </code>
///</example>
/// <returns>void</returns>
/// <param name="headerName">
/// <see cref="string"/>
/// The name of the header
/// </param>
/// <param name="headerValue">
/// <see cref="string"/>
/// The value to set for that header
/// </param>
/// <remarks/>
///
///------------------------------------------------------------------------------------------------------
#endregion
jasonjixiang 2005-08-03
  • 打赏
  • 举报
回复
up
elite2018 2005-08-03
  • 打赏
  • 举报
回复
直接在IE中访问这个WebServices,是否可以正常访问呢?
zeusvenus 2005-08-03
  • 打赏
  • 举报
回复
不要直接访问
saucer 2005-08-03
  • 打赏
  • 举报
回复
1. you shouldn't use HttpWebRequest to call a webservice directly unless necessarily

2. what Method/ContentType are you using?

3. see an example here

http://www.c-sharpcorner.com/Code/2004/Feb/GenericWebServiceProxy.asp
henryfan1 2005-08-03
  • 打赏
  • 举报
回复
用MSXML COM和XMLHTTP.NET类运行的情况是一样的,还是在同一个程序中调用同一个WebService.

有点没想到vs.net的WEB引用可以直接引用java平台下的webService.和调用.net的WebService一样方便.
  • 打赏
  • 举报
回复
up
elite2018 2005-08-03
  • 打赏
  • 举报
回复
直接在IE中访问这个WebServices,是否可以正常访问呢?
另外,该WebServices是否需要客户端验证才可以被访问,即使用安全套接字(SSL)的呢?

关于提到调用MSXML COM对象则可以正常访问,这个应该是在客户端使用Interop来调用该COM对象访问WebServices的,那么同样在客户端使用XMLHTTP类却不可以访问,是这样一种情况么?
elite2018 2005-08-02
  • 打赏
  • 举报
回复
mark
MyLf 2005-08-02
  • 打赏
  • 举报
回复
没在非.net下用过webservice.

帮顶。。

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧