我的应用程序中的Twitter推文有问题,我不明白为什么不工作。
这是我的代码:
TwitterHelper.Tweet(Message, Request,
unitOfWork.UserProfileRepository.GetByID(WebSecurity.CurrentUserId).ToString());
如果我使用Controller的ActionResult Index...
方法或编辑方法中的代码,正常工作。
但如果我使用自己的
ActionResult SendTweet(string message)
{
...
它不起作用。没有错误信息,只是没有到达推特,不想进行身份验证等。
我用ajax
从我的视图中调用此方法$.ajax({
url: "/MyController/SendTweet",
type: "POST",
dataType: "json",
data: { Message: $('#Message').val()},
success: function (data) { $('#Message').text = ''; }
});
如果我调试我的控制器,我有消息值并通过调用,没有异常,但没有工作。
更新 在Twitter身份验证之后使用Request参数。发生了什么:如果我打电话给索引,例如:
if(userName != TwitterHelper._userName)
{
TwitterHelper._userName = userName;
TwitterHelper._accessToken = null;
TwitterHelper._accessTokenSecret = null;
TwitterHelper._userId = null;
TwitterHelper._screenName = null;
}
之后:
SortedDictionary<string, string> requestTokenParams =
new SortedDictionary<string, string>();
requestTokenParams.Add("oauth_callback", HttpContext.Current.Request.Url.AbsoluteUri);
var tokenResponse =
TwitterHelper.GetToken("api.twitter.com/oauth/request_token";, requestTokenParams);
NameValueCollection qscoll = HttpUtility.ParseQueryString(tokenResponse);
var loginUrl = "api.twitter.com/oauth/authenticate?oauth_token=";
+ qscoll["oauth_token"];
和:
//(HERE THE BROWSER SHOWS THE TWITTER LOGIN) –
HttpContext.Current.Response.Redirect(loginUrl);
如果我从SendTweet方法调用Tweet,方式是一样的。但是在这里:HttpContext.Current.Response.Redirect(loginUrl);
没有显示任何内容,也没有登录页面。什么都没发生
答案 0 :(得分:0)
您无法Redirect
来电AJAX
。 (嗯......基本上)
该行:
HttpContext.Current.Response.Redirect(loginUrl);
因为您正在执行异步发布而无效。
以下是它的工作原理:
使用:
$.ajax({
url: "/MyController/SendTweet",
type: "POST",
dataType: "json",
data: { Message: $('#Message').val()},
success: function (data) { $('#Message').text = ''; }
});
您的浏览器正在请求与您的服务器进行异步连接,并且将等待数据到达。如果此数据包含Redirect
,则在此上下文中这不是真正有效的指令。它只是等待数据,而不是指令。
如何修复:
让ActionResult SendTweet(string message)
适合json
[HttpPost]
public JsonResult SendTweet(string message)
{
bool isAuthenticationRequired = //detect wether a user needs to login
if (isAuthenticationRequired)
{
//returns indicator that login is required
return Json(new { result = "unauthenticated" }, JsonRequestBehavior.AllowGet);
}
//do normal stuff
return Json(new { result = "tweet send!" }, JsonRequestBehavior.AllowGet);
}
然后,更新您的ajax
电话以处理结果:
$.ajax({
url: "/MyController/SendTweet",
type: "POST",
dataType: "json",
data: { Message: $('#Message').val()},
success: function (data) {
if (data.result == "unauthenticated"){
location.href = "an action which will redirect to the login page";
return;
}
$('#Message').text = ''; }
});
也许location.href
需要一些额外的参数才能重新发布数据,但现在看来已经足够了。
<强>更新强>
我对Twitter API
并不是很熟悉,但要重定向到正确的页面,您需要一个正常的ActionResult
,可能是Ajax
调用的Twitter API
。您可以向网址添加一些参数,或者requestTokenParams.Add("oauth_callback",
HttpContext.Current.Request.Url.AbsoluteUri);
可能会提供此类功能。
要重定向回正确的页面,请查看:
HttpContext.Current.Request.Url.AbsoluteUri
SendTweet
会再次向您发送json
操作,但由于这是post
requestTokenParams.Add("oauth_callback",
HttpContext.Current.Request.Url.AbsoluteUri);
操作,因此无法找到它。
您需要更改
ajax
到具有requestTokenParams.Add("oauth_callback",
"someactionresult?tweetmessage=" + message);
调用的页面或执行此操作的其他页面,然后重定向到原始页面。您还可以添加一些参数来重新发送推文消息。像这样:
public ActionResult someactionresult (string tweetmessage)
{
//do twitter stuff
return RedirectToAction("your original url");
}
采取行动:
{{1}}