基于C#后臺(tái)調(diào)用跨域MVC服務(wù)及帶Cookie驗(yàn)證的實(shí)現(xiàn)
背景
隨著富客戶端框架的盛行,以及眾多優(yōu)秀的前端js框架,很多情況我們會(huì)遇到跨域的問題,而js的ajax請求是不允許直接跨域訪問的,當(dāng)然你會(huì)說可以用JSONP等,但是由于代碼潔癖,不想在前端和后臺(tái)添加callback,而且很多情況你是無法控制的,需要牽連考慮太多的情況。
所以我直接繞過了,每個(gè)前端應(yīng)用,自帶一個(gè)通用后端服務(wù)代理,該服務(wù)解決跨域問題,自動(dòng)代理幫前臺(tái)獲取跨域的數(shù)據(jù)。
如何算跨域
雖然是個(gè)老問題,但是還是要提醒注意下兩點(diǎn):同IP,不同端口,數(shù)據(jù)訪問是跨域的,但是Cookie訪問是可以的(這個(gè)讓我很難理解)
解決,源碼
CookieContainer cookieContainer = new CookieContainer();
[HttpPost]
public string CommonPost(string url)
{
log.Info(CookieHelper.GetCookie("ITDC_UserName") + "進(jìn)入方法CommonPost Url=" + url);
Uri address = new Uri(System.Configuration.ConfigurationManager.AppSettings["RESTfulAPI"].ToString() + url);
HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
//遠(yuǎn)程服務(wù),需要加入cookie驗(yàn)證
cookieContainer.Add(address, GetCookie("ITDC_UserName"));
cookieContainer.Add(address, GetCookie("ITDC_UserRole"));
request.CookieContainer = cookieContainer;
StringBuilder data = new StringBuilder();
for (int i = 0; i < Request.QueryString.Count; i++)
{
if (Request.QueryString.Keys[i].ToString() == "url") continue;
data.Append("&" + Request.QueryString.Keys[i].ToString() + "=" + Request.QueryString[i].ToString());
}
// Create a byte array of the data we want to send
byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString().TrimStart('&'));
// Set the content length in the request headers
request.ContentLength = byteData.Length;
// Write data
using (Stream postStream = request.GetRequestStream())
{
postStream.Write(byteData, 0, byteData.Length);
}
string result = "";
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(response.GetResponseStream());
result = reader.ReadToEnd();
}
log.Info(CookieHelper.GetCookie("ITDC_UserName") + " 執(zhí)行完成 CommonPost Url=" + url);
return (result);
}
前臺(tái)調(diào)用
Ext.Ajax.request({url: APIUrl + '/Nebula/CommonPost?url=/Nebula/PostComment/&KlId=1&Msg=ok&Author=admin&Title=文章標(biāo)題',
method: "POST",
success: function (response) {
Ext.Viewport.unmask();
var obj = Ext.decode(response.responseText);
Ext.Msg.alert("提示", obj.Msg, Ext.emptyFn);
},
failure: function (response) {
Ext.Viewport.unmask();
Ext.Msg.alert("提示", "操作失敗,請檢查網(wǎng)絡(luò)!", Ext.emptyFn);
}
});
相關(guān)文章
C# TextBox多行文本框的字?jǐn)?shù)限制問題
最近在使用C# TextBox多行文本框的時(shí)候,發(fā)現(xiàn)了其對(duì)字?jǐn)?shù)限制的一點(diǎn)問題,所以總結(jié)下在使用C# TextBox多行文本框要注意的的字?jǐn)?shù)限制問題,現(xiàn)在分享給大家,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-12-12WinForm中DefWndProc、WndProc與IMessageFilter的區(qū)別
這篇文章主要介紹了WinForm中DefWndProc、WndProc與IMessageFilter的區(qū)別,較為詳細(xì)的分析了WinForm的消息處理機(jī)制,需要的朋友可以參考下2014-08-08Unity3D網(wǎng)格功能生成球體網(wǎng)格模型
這篇文章主要為大家詳細(xì)介紹了Unity3D網(wǎng)格功能生成球體網(wǎng)格模型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02