Я пытаюсь вызвать функцию веб-сервиса через, ПОЛУЧАЮТ метод с помощью jQuery, но имея проблему. Это - код веб-сервиса:
[WebService(Namespace = "http://something.com/samples")]
[ScriptService]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class TestWebService : System.Web.Services.WebService {
[WebMethod]
public string Test2()
{
string result = null;
try
{
result = "{'result':'success', 'datetime':'" + DateTime.Now.ToString() + "'";
}
catch (Exception ex)
{
result = "Something wrong happened";
}
return result;
}
}
Это - способ, которым я вызываю функцию:
$.ajax({ type: "GET",
url: "http://localhost/testwebsite/TestWebService.asmx/Test2",
data: "{}",
contentType: "application/json",
dataType: "json",
error: function (xhr, status, error) {
alert(xhr.responseText);
},
success: function (msg) {
alert('Call was successful!');
}
});
Метод называют успешно, но строка результата покрыта XML-тэгами, как это:
<string>
{'result':'success', 'datetime':'4/26/2010 12:11:18 PM'
</string>
И я получаю ошибку из-за этого (обработчик ошибок называют). Кто-либо знает то, что может быть сделано об этом?
Вы можете попробовать установить ResponseFormat для своих методов. См. http://williamsportwebdeveloper.com/cgi/wp/?p=494 , чтобы узнать, как они сделали это для JSON. Вероятно, это просто по умолчанию XML.
Не забудьте добавить это в свои параметры ajax:
contentType: "application/json; charset=utf-8"
Ваш общий запрос должен выглядеть так, чтобы вернуть json вместо XML:
$.ajax({ type: "GET",
url: "http://localhost/testwebsite/TestWebService.asmx/Test2",
data: "{}",
contentType: "application/json",
dataType: "json",
contentType: "application/json; charset=utf-8".
error: function (xhr, status, error) {
alert(xhr.responseText);
},
success: function (msg) {
alert('Call was successful!');
}
});
ScottGu имеет полную разбивку того, что требуется здесь , но похоже например, отсутствующий contentType
в вашем случае (он тоже на некоторое время свел меня с ума).
Вам необходимо украсить метод атрибутом ScriptMethodAttribute :
[WebService(Namespace = "http://something.com/samples")]
[ScriptService]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class TestWebService : System.Web.Services.WebService {
[WebMethod]
[ScriptMethod]
public string Test2()
{
[...]
}
}
Это гарантирует, что метод возвращает JSON по умолчанию (значение по умолчанию ResponseFormat
- Json
).
Включить веб-службу ASP.NET ASMX для запросов HTTP POST / GET
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public string Test2()
{
[...]
}
Правило для json: Вы можете получить доступ к данным только из того же домена !
Единственное исключение - использование jsonp (что довольно сложно реализовать, поскольку в платформе .NET нет сериализатора jsonp).
Если вы используете стандартную веб-службу (и , а не WCF ), вы можете найти руководство по реализации этого здесь .
Вы пробовали WebInvokeAttribute
, у него есть члены, определяющие форматы запроса и ответа, которые вы можете установить в WebMessageFormat.Json
.
Что-то вроде:
[WebInvoke(UriTemplate = "ServiceName", RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare,
Method = "POST")]