2013-03-18 2 views
0

У меня есть перекрестный домен 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. enter image description here

может кто-нибудь сказать мне, что может быть проблемой.

ответ

0

Скорее всего, поскольку ваш веб-сервис находится во внешнем домене, это проблема с кроссдоменом. Для этого вам необходимо использовать jsonp.

Вы можете посмотреть здесь - Basic how-to for cross domain jsonp

+0

спасибо за ответ, но я уже использовал функцию обратного вызова =? так как это кросс-домен, в этом случае он должен работать, я не вижу ничего другого. – Abbas

+0

Вам необходимо установить JSONPBehavior на уровне обслуживания. Проверьте http://archive.msdn.microsoft.com/DataServicesJSONP – Dinesh

Смежные вопросы