2014-01-27 3 views
2

Проблема в том, как получить доступ к службе 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 тоже не нужна).

ответ

1

Возможно, вы столкнулись с кросс-доменным запросом (http://www.d-mueller.de/blog/cross-domain-ajax-guide/).

Попробуйте CORS (http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) или JSONP (http://en.wikipedia.org/wiki/JSONP) или что-то подобное.

+0

Я так не думаю, похоже, что все тесты проводятся на 'localhost'. –

+0

Порт, протокол и домен должны быть одинаковыми. – meilke

+0

Слишком ты прав; Я думаю, что вы отвечаете, может быть, больше, чем у меня. –

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