带有 WCF 调用的 Ajax 返回 404 错误
Posted
技术标签:
【中文标题】带有 WCF 调用的 Ajax 返回 404 错误【英文标题】:Ajax with WCF call returns 404 Error 【发布时间】:2016-05-26 11:14:12 【问题描述】:我想通过 Ajax 调用来调用 WCF 服务,但它返回给我一个 404 Error Not found 错误
可以通过浏览器访问url,1506端口是开放的
这是我的 Ajax 调用: 我想使用 POST 类型
$.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 方法 [服务合同] 公共接口 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>
【问题讨论】:
404 表示 ajax 调用无法访问用于发布请求的 url。这意味着找不到资源。使用 chrome 调试器工具(F12)网络选项卡/fiddler/postman 监视请求。还要查看您的 ajax 调用,您发送的对象在哪里? 【参考方案1】:使用工具进行一些测试以验证您的问题。 我通常使用Postman。它允许您构建 POST 消息并针对您的端点对其进行测试,这是您确定问题的实际原因的最佳方式。
【讨论】:
好的,我安装了 Postman,使用 192.168.80.18:1506/Service1.svc,我得到了 200 OK,该 url 是可访问的,但使用 192.168.80.18:1506/Service1.svc/GetData,我得到 404 Not Found,这似乎是函数的问题跨度> 【参考方案2】:我找到了一个解决方案,现在它可以工作了 在这种情况下,不要忘记将端口 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 中添加了 services 标签,以在里面添加 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);
);
【讨论】:
你能澄清一下你改变了什么吗?以上是关于带有 WCF 调用的 Ajax 返回 404 错误的主要内容,如果未能解决你的问题,请参考以下文章
WCF 休息 WebInvoke 获取方法不起作用返回 404 错误