2015-05-16 4 views
0

Я борется с попыткой получить данные из службы WCF без везения, я был бы признателен за вашу помощь, это мой код, и я всегда получаю «0 undefined» в функции ошибки в Ajax вызова:Использовать службу WCF с помощью jQuery

Service1.svc.cs

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service1 : IService1 
{ 
    public string GetData() 
    { 
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     string output = "It worked"; 

     return serializer.Serialize(output); 
    } 
} 

IService1.cs

[OperationContract] 
    [System.ServiceModel.Web.WebInvoke(Method = "POST", 
     ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json)] 
    string GetData(); 

Web.config

<?xml version="1.0"?> 
<configuration> 

    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    </appSettings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5"/> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="ServiceAspNetAjaxBehavior"> 
      <enableWebScript /> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
    <services> 
     <service behaviorConfiguration="ServiceBehavior" name="MyService.Service1"> 
     <endpoint address="" binding="webHttpBinding" contract="MyService.IService1" behaviorConfiguration="ServiceAspNetAjaxBehavior"> 
      <identity> 
      <dns value="localhost"/> 
      </identity> 
      </endpoint> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      </service> 
     </services> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <!-- 
     To browse web app root directory during debugging, set the value below to true. 
     Set to false before deployment to avoid disclosing web app folder information. 
     --> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 

</configuration> 

JQuery вызов

<script type="text/javascript"> 

    $(document).ready(function() { 
     CallMyService(); 
    }); 

    function CallMyService() { 
     $.ajax({ 
      type: "POST", 
      url: "http://localhost:54368/Service1.svc/GetData", 
      data: '', 
      dataType: "json", 
      contentType: "application/json", 
      success: ServiceSucceeded, 
      error: ServiceFailed 
     }); 
    } 

    function ServiceFailed(result) { 
     alert(result.status + ' ' + result.statusText); 
    } 

    function ServiceSucceeded(result) { 
     var resultObject = result.GetDataResult; 
     alert(resultObject); 
    } 

</script> 

Если я пытаюсь потреблять службы WCF из C# проекта, добавив ссылки на службу, я получаю это:

Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт myReference.IService1 в разделе конфигурации клиента ServiceModel. Возможно, это связано с тем, что файл конфигурации не найден для вашего приложения или потому, что элемент-конечный элемент, соответствующий этому контракту, не найден в клиентском элементе.

Не может быть связано с этой ошибкой? Служба WCF размещается в IIS локально.

Я просто не знаю, что еще проверить.

UPDATE:

Я просто нашел решение, то получается, что мне нужно в файл Global.asax в решении WCF службы со следующим кодом:

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost"); 
     if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
     { 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE"); 

      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
      HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
      HttpContext.Current.Response.End(); 
     } 
    } 

Где находится локальный где находится ваша служба WCF, после этого она работает! Большое спасибо вам обоим, кто рассказал мне об отладчике Javascript, который дал мне ключ!

+1

result.GetDataResult дает вам эту ошибку. Вы можете отлаживать свой javascript из Google Chrome и видеть, какие значения возвращаются из результата. – Hakunamatata

+0

Я только что изменил его на: успех: функция (результат) { \t \t \t \t alert (result.d); \t \t \t \t} с тем же результатом. Как отлаживать код javascript из Google chrome? – saman0suke

+1

Вместо использования 'alert (resultObject)' в вашем сценарии jQuery используйте 'console.log (result)'. Затем вы можете просмотреть результат в своей консоли разработчика, которую вы обычно открываете с помощью клавиши «F12». Найдите вкладку «Консоль» в открывшейся панели. – Schlaus

ответ

0

UPDATE:

Я просто нашел решение, то получается, что мне нужно в файл Global.asax в решении WCF службы со следующим кодом:

protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost"); 
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
    { 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE"); 

     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
     HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
     HttpContext.Current.Response.End(); 
    } 
} 

Где находится локальный где находится ваша служба WCF, после этого она работает! Большое спасибо вам обоим, кто рассказал мне об отладчике Javascript, который дал мне ключ!

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