Проблема в том, как получить доступ к службе non aspx из JQuery.Вызов службы WCF из JQuery не работает
Что я пробовал:
Самого простой случай:
контракт:
using System.ServiceModel;
using System.ServiceModel.Web;
namespace TheService
{
[ServiceContract]
public interface ITheService
{
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
string Get();
}
}
Служба: с использованием системы; с использованием System.ServiceModel.Web;
namespace TheService
{
public class TheService : ITheService
{
public string Get()
{
return "Hello, world!";
}
}
}
хостинг услуги:
class Program
{
static void Main(string[] args)
{
Uri httpUrl = new Uri("http://localhost:22334/TheService");
ServiceHost host = new ServiceHost(typeof(TheService), httpUrl);
ServiceMetadataBehavior serviceMetaDataBehaviour = new ServiceMetadataBehavior
{
HttpGetEnabled = true,
MetadataExporter = {PolicyVersion = PolicyVersion.Policy15}
};
host.Description.Behaviors.Add(serviceMetaDataBehaviour);
host.AddServiceEndpoint(typeof(ITheService), new WebHttpBinding(), "");
host.Open();
Console.ReadLine();
}
}
Если я пытаюсь получить доступ к сервису с wcftestclient, я могу получить доступ к данным.
Теперь я пытался получить к нему доступ с помощью JQuery
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
$(document).ready(function() {
$.getJSON("http://localhost:22334/TheService/Get",
function(data){
alert("Data Loaded: " + data);
});
});
</script>
</head>
<body>
</body>
</html>
То, что я предположил, что должно случиться, что я получаю Привет мир обратно. но это не так.
Я пробовал:
$.ajax({
type: "GET",
url: "http://localhost:22334/TheService/Get",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
alert(msg);
},
error: function(err) {
alert(err.toString());
if (err.status == 200) {
ParseResult(err);
}
else { alert('Error:' + err.responseText + ' Status: ' + err.status); }
}
});
и все, что я получил, было два предупреждения «[Объект] Объект» и «Ошибка: Статус: 0»
Таким образом, в данном случае, кажется, что он работает в какой-то ошибка, но в которой?
Я никогда раньше не использовал jquery, так есть ли где-нибудь, где можно получить более полезное сообщение об ошибке?
Должен ли я определить что-нибудь еще в службе wcf?
В конце оба проекта не должны быть в одном приложении. JQuery следует использовать на стороне клиента, а служба wcf запускается на централизованном сервере.
Если я изменить
ServiceHost host = new ServiceHost(typeof(TheService), httpUrl);
в
WebServiceHost host = new WebServiceHost(typeof(ServiceCalculator), httpUrl);
я могу видеть, что точка отладки на сервере WCF достигается (возврат текста) - но все же оба Диалоги об ошибках шоу.
(добавлено: localhost: 22334/TheService/Get возвращает «Hello World» в браузере - поэтому я думаю, что это либо проблема с JQuery/Ajax, либо?)
Update:
В соответствии с ответом и http://pranayamr.blogspot.de/2011/06/calling-cross-domain-wcf-service-using.html я добавил следующее:
Set Debug истина:
ServiceDebugBehavior debug = host.Description.Behaviors.Find<ServiceDebugBehavior>();
if (debug == null)
{
host.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });
}
else
{
if (!debug.IncludeExceptionDetailInFaults)
{
debug.IncludeExceptionDetailInFaults = true;
}
}
изменить поведение совместимости осины
for (int i = 0; i < host.Description.Behaviors.Count; i++)
{
if (host.Description.Behaviors[i] is AspNetCompatibilityRequirementsAttribute)
{
host.Description.Behaviors.RemoveAt(i);
break;
}
}
host.Description.Behaviors.Add(new AspNetCompatibilityRequirementsAttribute { RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed });
позволяют crossdomainscriptaccess
host.Description.Behaviors.Add(serviceMetaDataBehaviour);
WebHttpBinding binding = new WebHttpBinding {CrossDomainScriptAccessEnabled = true};
host.AddServiceEndpoint(typeof(IServiceCalculator), binding, "");
и попытался установить JSONP
$.ajax({
type: "GET",
url: "http://localhost:22334/TheService",
method: "Get",
contentType: "application/json; charset=utf-8",
dataType: 'jsonp',
success: function(msg) {
alert(msg);
},
error: function(err) {
alert(err.toString());
if (err.status == 200) {
ParseResult(err);
}
else { alert('Error:' + err.responseText + ' Status: ' + err.status); }
}
});
Теперь, кажется, работает как-то. (По-прежнему не получается получить реальную информацию об ошибках, если что-то пойдет не так) (и часть asp тоже не нужна).
Я так не думаю, похоже, что все тесты проводятся на 'localhost'. –
Порт, протокол и домен должны быть одинаковыми. – meilke
Слишком ты прав; Я думаю, что вы отвечаете, может быть, больше, чем у меня. –