在ASP.NET開發中使用非.Net Web服務

來源:互聯網
上載者:User
asp.net|web|web服務 對於如何使用 WebRequest 和 WebResponse 類在 URI 上產生 POST 請求,在微軟的 .Net 快速入門教程中有詳細的描述(http://chs.gotdotnet.com/quickstart/howto/doc/WebRequests/clientPOST.aspx),簡要引用如下:

WebResponse 類是抽象(在 Visual Basic 中為 MustInherit)基類,協議特定的響應類從該抽象基類派生。應用程式可以使用 WebResponse 類的執行個體以協議不可知的方式參與請求和響應事務,而從 WebResponse 派生的協議特定的類攜帶請求的詳細資料。

用戶端應用程式不直接建立 WebResponse 對象,而是通過調用 WebRequest 執行個體上的 GetResponse 方法來建立它。

對繼承者的說明: 從 WebResponse 繼承時,必須重寫以下成員:ContentLength、ContentType、GetResponseStream、ResponseUri 和 Headers。

如果需要使用 WebRequest 和 WebResponse 類在 URI 上產生 GET 請求。可在函數 getPage 中找到產生請求的特定詳細資料。getPage 函數採用字串參數,該參數是您請求的 Web 頁的 URL(或 URI)。然後,此 URI 作為參數包括在對 WebRequest.Create 的調用中,該調用建立 WebRequest 對象。接著,WebRequest 對象的 GetResponse 函數用於擷取 WebResponse 對象。此對象可用於擷取響應的狀態碼以及實際響應流(例如,Web 頁)。可以採用幾種不同的形式寫出該流。

在處理完響應流後,必須確保調用 WebResponse 對象的 Close 方法,以免泄露有價值的系統資源。

如果需要使用 WebRequest 和 WebResponse 類在 URI 上產生 POST 請求。 則可採用類似於帶有 GET 謂詞的簡單 WebRequest。其中有兩處不同:
1) 謂詞需要更改為 POST。
2) 需要對格式資訊進行編碼並發送到流中。
若要更改謂詞,只需將 Method 屬性設定為“POST”。 然後必須將 ContentType 屬性設定為“application/x-www-form-urlencoded”。此時,確保所提供的字串編碼正確,所有內容都將被正確地傳遞 (POST)。

處理完響應流後,必須確保調用 WebResponse 對象的 Close 方法,以免泄露有價值的系統資源。

<!-- 本文 -->

瞭解了具體的實現方法及原理後,就可以實現其目的。首先需要一個函數以實現該功能:

/// <summary>
/// getPage 獲得 Post 請求結果頁
/// url 要請求的地址
/// payload 輸入的參數<xml>
/// outputResp 輸出結果
/// </summary>
private bool getPage(String url, String payload, ref string outputResp)
{
WebResponse result = null;
outputResp = "";
try
{
WebRequest req = WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
if (payload != null)
{
string UrlEncoded = payload;

byte[] SomeBytes = null;
SomeBytes = Encoding.UTF8.GetBytes(UrlEncoded.ToString());
req.ContentLength = SomeBytes.Length;
Stream newStream = req.GetRequestStream();
newStream.Write(SomeBytes, 0, SomeBytes.Length);
newStream.Close();
}
else
{
req.ContentLength = 0;
}
result = req.GetResponse();
Stream ReceiveStream = result.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader sr = new StreamReader(ReceiveStream, encode);
outputResp = sr.ReadToEnd();
}
catch(Exception e)
{
Console.WriteLine( e.ToString());
Console.WriteLine("\r\n找不到請求 URI,或者它的格式不正確");
return false;
}
finally
{
if ( result != null )
{
result.Close();
}
}
return true;
}

這個函數就實現了具體的請求功能,要求輸入請求的地址(URL)及參數(payload:XML檔案格式),然後 WebRequest 向服務地址發送 POST 請求,由 StreamReader 讀出具體的結果,下面是一個具體的使用該函數的例子:

private void Button_ServerClick(object sender, System.EventArgs e)
{
string UserRegisterReq = "";
UserRegisterReq = @"<?xml version=""1.0"" encoding=""GB2312""?>
<ELink>
<MsgType>UserRegisterReq</MsgType>
<Version>1.0</Version>
<UserProfile>
<UserName>Test</UserName>
<UserPwd>Test</UserPwd>
</UserProfile>
</ELink>";
string outputResp = "";
bool IsReg = false;
IsReg = this.getPage(@"http://dll.test.com/test.dll/", UserRegisterReq, ref outputResp);

if(IsReg)
{
// outputResp = outputResp.Replace(@"<", "<");
// outputResp = outputResp.Replace(@">", ">");
Response.Write(outputResp);
}
}

Button_ServerClick 是一個 Button 單擊事件,當輸入正確的 URL(請求地址)和 payload(輸入的參數),就得到由服務程式提供的傳回值。




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.