asp.net中WebResponse 跨域訪問示例

一篇朋友很久前寫的asp.net中WebResponse 跨域訪問示例,下面我轉過來與大家一起學習學習,希望文章對大家會有幫助。

前兩天,一個朋友讓我幫他寫這樣一個程序:在asp.net裏面訪問asp的頁面,把數據提交對方的數據庫後,根據返回的值(返回值爲:OK或ERROR),如果爲OK再把填入本地數據庫。當時,想當然,覺得很簡單,用js的xmlhttp ,如果根據response 的值是“OK”就執行提交本地數據庫。很快寫完發過去,讓朋友試試,一試發現不行,後來一問,原來是跨域訪問,我給忽略了,于是讓朋友把asp改成web service,可朋友說程序是合作公司做的,只會asp,不會用web service ,狂暈ing。沒辦法,只能請出asp.net的 WebResponse了,很多網站采集程序都是用這個。第一版寫完了,倒是可以跨域訪問了,不過是亂碼,調整有關編碼的方式,終于可以了。這個應用雖小可是涉及的知識點不少:

1、xmlhttp 不能跨域提交。

當然XMLHttpRequest還是權宜的解決的方法,

2、webresponse可以進行跨域訪問,不過要注意

1)、get和post的區別。
2)、注意Timeout的問題。

這些都是簡單的程序,記下來備忘,高手就不必看了。

不廢話了,下面是相關的c#代碼:

代碼如下
/// <summary>
/// 使用Post方法發送數據
/// </summary>
/// <param name=”pi_strPostURl”>提交地址</param>
/// <param name=”pi_strParm”>參數</param>
/// <returns></returns>
public static string PostResponse(string pi_strPostURl, string pi_strParm)
{
try
{
//編碼
Encoding t_Encoding = Encoding.GetEncoding(“GB2312“);
Uri t_Uri = new Uri(pi_strPostURl);
byte[] paramBytes = t_Encoding.GetBytes(pi_strParm);
WebRequest t_WebRequest = WebRequest.Create(t_Uri);
t_WebRequest.Timeout = 100000;
//設置ContentType
t_WebRequest.ContentType = “application/x-www-form-urlencoded“;

t_WebRequest.Method = EnumMethod.POST.ToString(); //初始化
using (Stream t_REStream = t_WebRequest.GetRequestStream())
{
//發送數據
requestStream.Write(paramBytes, 0
, paramBytes.Length);
}

WebResponse t_WebResponse =
t_WebRequest.GetResponse();

using (StreamReader t_StreamReader = new StreamReader(t_WebResponse .GetResponseStream(), t_Encoding))
{
return t_StreamReader.ReadToEnd();
}
}
catch
{
return “ERROR“;
}
}

public static string GetResponse(string pi_strPostURl, string pi_strParm)
{
try
{
//編碼
Encoding t_Encoding = Encoding.GetEncoding(“GB2312“);
Uri t_Uri = new Uri(string.Format(“{0}?{1}“, pi_strPostURl, pi_strParm));

WebRequest t_WebRequest =
WebRequest.Create(t_Uri);

t_WebRequest.Timeout = 100000;
t_WebRequest.ContentType = “application/x-www-form-urlencoded“;

t_WebRequest.Method = EnumMethod.GET.ToString();
WebResponse t_WebResponse =
t_WebRequest.GetResponse();

using (StreamReader t_StreamReader = new StreamReader(t_WebResponse.GetResponseStream(), t_Encoding))
{
return t_StreamReader.ReadToEnd();
}
}
catch (Exception e)
{
return e.ToString();
}
}
public static string AtionResponse(string pi_Url, EnumMethod pi_Method)
{
string t_strUrlPath=“”;
string t_parm = “”;
Uri t_Url = new Uri(pi_Url);
t_parm= t_Url.Query;
if (parmString.StartsWith(“?“))
t_parm = t_parm.Remove(0, 1);
t_strUrlPath = “http://“ + t_Url .Authority + t_Url .AbsolutePath;
return GetResponse(t_strUrlPath, t_parm, pi_Method);
}
public enum EnumMethod
{
POST,
GET
}

現在jquery ajax支持跨域了,下面看個實例我們可對上面進行處理成json數據即可

JQuery.getJSON也同樣支持jsonp的數據方式調用。

客戶端JQuery.ajax的調用代碼示例:

代碼如下

$.ajax({
type : "get",
async:false,
url : "http://www.xxx.com/ajax.do",
dataType : "jsonp",
jsonp: "callbackparam",//服務端用于接收callback調用的function名的參數
jsonpCallback:"success_jsonpCallback",//callback的function名稱
success : function(json){
alert(json);
alert(json[0].name);
},
error:function(){
alert('fail');
}
});

服務端返回數據的示例代碼:

代碼如下
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
String callbackFunName = context.Request["callbackparam"];
context.Response.Write(callbackFunName + "([ { name:"John"}])");
}

而jquery.getScript方式處理的原理類似,也同樣需要服務端返回數據上做支持,不同的是服務端返回的結果不同。不是返回一個callback的function調用,而是直接將結果賦值給請求傳遞的變量名。客戶端則是像引入一個外部script一樣載入返回的數據。

更多相關文章
  • 本文章總結多種關于Iframe跨域訪問不能寫cookie問題的解決辦法,其實我最喜歡的是利用程序來解決,前面的設置站點信任是不可取的哦.假設A嵌套了B解決方法:第一種很簡單:將系統B設置爲可信站點.第二種:IE設置隱
  • JSONP(JSON with Padding)是JSON的一種"使用模式",可用于解決主流浏覽器的跨域數據訪問的問題.現在我們來用JSONP解決Ajax跨域訪問問題.前幾天,工作上有一新需求,需要前端web頁面異步調用後台的Webservice方法返回信息.實現方法有多種,本例 ...
  • 關于跨域問題一直是我們比較糾結的地方,下面我來總結一下關于ajax跨域訪問及JQuery的跨域的原理與解決辦法,希望此方法對各位同學有所幫助.JS的跨域問題,我想很多程序員的腦海裏面還認爲JS是不能跨域的,其實這是一
  • 文章分享一篇關于利用了jquery的ajax 來訪問wcf 伺服器,同時支持GET.POST.PUT.DELETE等常用的訪問方法,後面一個實例介紹了跨域訪問WCF有需要了解的同學可以看看. 代碼如下 using jquery ajax call wcf service get/post/put/d
  • 現在浏覽器多但是很多時候標准不一樣兼容性也不好,下面我來介紹解決ff和IE9對icon font字體的跨域訪問不兼容問題,這裏介紹的是apache與nginx的方法.apache解決辦法可以將字體文件放到同域的伺服器上或修改伺服器配置.把如下代碼加到你的伺服器配置文件中去,我用的是apache2,這 ...
  • 這可能是由于試圖以跨域方式訪問服務而又沒有正確的跨域策略,或策略不適用于 SOAP 服務.您可能需要與該服務的所有者聯系,以發布跨域策略文件並確保該文件允許發送 SOAP 相關的 HTTP 標頭.出現此錯誤也可能是由
  • ajax跨域之cors我以前有介紹過,因爲安全限制JavaScript或Cookie只能訪問同域下的內容而不能訪問其它域下的內容了,但我們可以通過像jsonp或CORS來實現了,下面看幾個測試例子.由于安全限制(同源
  • 我們網站開了日志爲防止別人亂刷所以會把日志開啓了,日志文件比較大通常是需要工具來分析的,下面給各位整理了一個linux下shell及awk統計日志中相同ip的訪問次數一些例子,希望對各位有幫助.awk統計ip訪問次數 現在有一個文件,數據量大概在200多萬條記錄,想用shell的awk做統計,文件的
一周排行
  • 以下是本人整理的25個Apache的面試題,難度初中等,後面附有參考答案,准備面度的朋友可以參考一下. 我們強烈建議你不要去死記硬背,萬事首先都要嘗試去放在實際場景中理解. 1. 什麽是Apache web伺服器? ...
  • 在制作網頁時,有時我們不能保證網頁內容的多少,如果不設置高度,內容太少時不協調,但是把調試定死,內容顯示不完整,現在們來介紹一個設置高度神器min-height,看字面就知道是設置最小高度,絕對滿足你.最小高度min ...
  • TL-TR861 mini路由器設置指南
    本文章來給大家介紹一下TL-TR861 mini路由器設置指南,如果你使用的是TL-TR8
  • 今天介紹一下關于json數據解析,我們使用Android中的JSONObject和JSONArray解析json數據,有android開發的朋友可以參考一下. String strJson = "{&quo ...
  • 本文章介紹了關于smarty模板中怎麽使用urlencode()函數,有需要的朋友可參考一下.解決方法一直接在php中使用 代碼如下 $a = urlencode($str); 方法二在smarty模板中如下操作 代 ...
  • 本文章爲各位來介紹linux中Bash數組操作教程,這篇教程詳細的介紹了bash數組的一個使用方法,希望文章能夠對各位有用.一.定義數組1. 使用[]操作符names[0]='zrong'names[1]='jack
  • 本文章來給大家介紹關于怎麽把百度編輯器(Ueditor)整合到dedecms中吧,現在百度編輯器感覺比dedecms自帶的編輯器要強多了,下面我來給大家介紹替換dedecms自帶編輯器方法.Ueditor整合dede ...
  • 引用文件的方法有兩種:require 及 include.兩種方式提供不同的使用彈性. require 的使用方法如 require("MyRequireFile.php"); .這個函數通常放在 ...
  • 1.正常的touch創建word2.fopen 打開word3.fwrite 寫入word 並保存這樣會出現一個問題 如果寫入的東西裏面含有html代碼的話,它將直接寫入word而不是 排版了這個問題 需要在輸出ht ...
  • 這三種方法都是從網上找到了,第一種測試可以,後面二種也可以,不過第一次在不同浏覽器可能不兼容.*///方法一echo "document.write('<script language="j ...