У меня есть перекрестный домен webservice, который я хочу вызвать, однако, когда я пытаюсь его вызвать, я получаю правильный ответ в json (отмечен в firebug), но успешный обратный вызов никогда не срабатывает, вместо этого он выполняет обратный вызов ошибки.
Это мой код javascript.
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
$.getJSON("http://[external domain]/Service.asmx/SendMail?callback=?", { 'body': txtEmail.value }, function (data) {
alert("SUCCESS");
})
.error(function (data) { alert("ERROR: " + data.responseText); })
});
});
</script>
Вот мой код webservice.
<%@ WebService Language="C#" Class="Service" %>
using System;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;
using System.Net.Mail;
using System.Web.Script.Serialization;
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[ScriptService]
public class Service : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void SendMail(string body)
{
Context.Response.Clear();
Context.Response.AddHeader("Access-Control-Allow-Origin", "*");
Context.Response.ContentType = "application/json";
JavaScriptSerializer js = new JavaScriptSerializer();
try
{
MailMessage message = new MailMessage();
message.From = new MailAddress("[senders mail]");
message.To.Add("[recepient mail]");
message.IsBodyHtml = true;
message.Priority = MailPriority.High;
message.Subject = "[subject]";
message.Body = body;
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
client.EnableSsl = true;
client.Credentials = new System.Net.NetworkCredential("[username]", "[password]");
client.Send(message);
string str = "{\"value\" : \"sent\"}";
// also tried with JavascriptSerializer like in catch block, that too not working.
Context.Response.Flush();
Context.Response.Write(str);
}
catch(Exception ex)
{
string str = js.Serialize(ex.Message);
Context.Response.Flush();
Context.Response.Write(str);
}
}
}
Ниже приведен ответ, прослеженный в firebug.
может кто-нибудь сказать мне, что может быть проблемой.
спасибо за ответ, но я уже использовал функцию обратного вызова =? так как это кросс-домен, в этом случае он должен работать, я не вижу ничего другого. – Abbas
Вам необходимо установить JSONPBehavior на уровне обслуживания. Проверьте http://archive.msdn.microsoft.com/DataServicesJSONP – Dinesh