2016-02-15 4 views
0

Я хотел бы, чтобы вызвать службу WCF с вызовом Ajax, но он возвращает меня 404 Ошибка Не найдена ошибкаAjax с WCF вызова возвращает 404 Ошибка

URL-адрес доступен через браузер и порт 1506 открыт

Это мой Ajax вызов: Я хотел бы использовать тип записи

$.ajax(
    { 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     url: "http://192.168.80.18:1506/Service1.svc/GetData", 
     type: 'POST', 
     success: function (data, status, xhr) 
     { 
      alert('Success: '+data); 
     },       
     error: function(x, e) 
     { 
      if (x.status == 0) { 
        alert('You are offline!!\n Please Check Your Network.'); 
       } else if (x.status == 404) { 
        // Here is the problem 
        alert('Requested URL not found.'); 
       } else if (x.status == 500) { 
        alert('Internal Server Error.'); 
       } else if (e == 'parsererror') { 
        alert('Error.\nParsing JSON Request failed.'); 
       } else if (e == 'timeout') { 
        alert('Request Time out.'); 
       } else { 
        alert('Unknow Error.\n' + x.responseText); 
       } 
     } 
    }); 

WCF сторона

IService1.cs Здесь я добавил, метод POST [ServiceContract] общедоступный интерфейс IService1 {

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

    [OperationContract] 
    CompositeType GetDataUsingDataContract(CompositeType composite); 

    // TODO: ajoutez vos opérations de service ici 
} 

Service1.svc

public class Service1 : IService1 
{ 
    public string GetData() 
    { 
     return "Hello world!"; 
    } 
} 

Web.config

<?xml version="1.0" encoding="utf-8"?> 
<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> 
      <!-- Pour éviter la divulgation d'informations de métadonnées, définissez les valeurs ci-dessous sur false avant le déploiement --> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <!-- Pour recevoir les détails de l'exception dans les erreurs à des fins de débogage, définissez la valeur ci-dessous sur true. Pour éviter la divulgation d'informations d'exception, définissez-la sur false avant le déploiement --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service name="WcfService1.Service1"> 
     <endpoint address="Service1.svc" 
        binding="basicHttpBinding" 
        contract="WcfService1.IService1" /> 
     </service> 
    </services> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </protocolMapping>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <!-- 
     Pour parcourir le répertoire racine de l'application Web lors du débogage, définissez la valeur ci-dessous sur true. 
     Définissez-la sur false avant le déploiement pour ne pas divulguer d'informations du dossier de l'application Web. 
     --> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 
</configuration> 
+0

404 означает URL-адрес, который использует для запроса поста не может соприкоснуться АЯКС call.It означает ресурс не found.Monitor на reuqest либо с хромом отладчик инструмента (F12) сетевая вкладка/скрипач/почтальон. Также смотрите на ваш вызов ajax, где находится ваш объект, который вы отправляете? –

ответ

1

Проведите некоторое тестирование с помощью инструмента для проверки вашей проблемы. Обычно я использую Postman. Он позволяет вам построить сообщение POST и протестировать его против вашей конечной точки, это лучший способ определить фактическую причину проблемы.

+0

Хорошо, я установил Postman, с http://192.168.80.18:1506/Service1.svc, я получил 200 OK, URL доступен, но с http://192.168.80.18:1506/Service1.svc/GetData, я получил 404 Not Found, это похоже на проблему с функцией –

0

Я нашел решение, и теперь он работает В этом случае не забудьте порт 3070 в настройках брандмауэра

Если вы хотите получить доступ к вашим услугам из другого компьютера, вы можете изменить applicationhost. XML-файл

IService1.cs Здесь я добавил ResponseFormat (JSON), в RequestFormat (JSON), в UriTemplate, чтобы получить доступ к своим функциям через URL: http://192.168.80.18:3070/Service1.svc/GetData

public interface IService1 
{ 

    [OperationContract] 
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, RequestFormat=WebMessageFormat.Json,UriTemplate="/getdata")] 
    string GetData(); 

    [OperationContract] 
    CompositeType GetDataUsingDataContract(CompositeType composite); 
} 

Service1.svc.cs здесь никаких изменений

public class Service1 : IService1 
{ 
    public string GetData() 
    { 
     return "It works"; 
    } 

    public CompositeType GetDataUsingDataContract(CompositeType composite) 
    { 
     if (composite == null) 
     { 
      throw new ArgumentNullException("composite"); 
     } 
     if (composite.BoolValue) 
     { 
      composite.StringValue += "Suffix"; 
     } 
     return composite; 
    } 
} 

Web.config Здесь я добавил услуги тег с endpointBehaviors добавить webHttp тег внутри

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 

    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    </appSettings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" maxUrlLength="500"/> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service name="WcfService2.Service1"> 
      <!-- Service Endpoints --> 
      <endpoint address="" binding="webHttpBinding" contract="WcfService2.IService1" behaviorConfiguration="webBehavior"> 
      </endpoint> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="webBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- Pour éviter la divulgation d'informations de métadonnées, définissez les valeurs ci-dessous sur false avant le déploiement --> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <!-- Pour recevoir les détails de l'exception dans les erreurs à des fins de débogage, définissez la valeur ci-dessous sur true. Pour éviter la divulgation d'informations d'exception, définissez-la sur false avant le déploiement --> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </protocolMapping>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <!-- 
     Pour parcourir le répertoire racine de l'application Web lors du débogage, définissez la valeur ci-dessous sur true. 
     Définissez-la sur false avant le déploiement pour ne pas divulguer d'informations du dossier de l'application Web. 
     --> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 

</configuration> 

Ajax боковых Никаких серьезных изменений здесь

$.ajax(
    { 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     url: "http://192.168.80.18:3070/Service1.svc/GetData", 
     type: 'GET', 
     data: "{}", 
     success: function (data, status, xhr) 
     { 
      alert('Success: '+data); 
     },       
     error: function(x, e) 
     { 
      if (x.status == 0) { 
        alert('You are offline!!\n Please Check Your Network.'); 
       } else if (x.status == 404) { 
        alert('Requested URL not found.'); 
       } else if (x.status == 500) { 
        alert('Internal Server Error.'); 
       } else if (e == 'parsererror') { 
        alert('Error.\nParsing JSON Request failed.'); 
       } else if (e == 'timeout') { 
        alert('Request Time out.'); 
       } else { 
        alert('Unknow Error.\n' + x.responseText); 
       } 
     } 
    }); 
+1

Не могли бы вы прояснить, что вы изменили? –