当我把wcf服务和我的web页面放到一起解决方案的时候,web页面可以成功调用wcf服务。但是当 我把wcf服务单独作为一个项目然后运行,然后在新建一个web项目进行调用wcf的服务就不行,应该是配置没有配好吧。(以上两种情况均没有部署)
==================5月22号分割线 ========
====跨越问题已经解决,请直接拉到靠下的位置,有个部署后访问的问题==========
(其中 wcf的框架为4.5)
核心代码如下:
配置文件代码
<configuration> <appSettings> <add key="SQLConnection" value="Data Source=.\AZZEXPRESS;Initial Catalog=smallfish;Integrated Security=True"/> </appSettings> <connectionStrings/> <!-- 有关 .NET 4.5 的 web.config 更改的说明,请参见 http://go.microsoft.com/fwlink/?LinkId=235367。 可在 <httpRuntime> 标记上设置以下特性。 <system.Web> <httpRuntime targetFramework="4.5" /> </system.Web> --> <system.web> <compilation debug="true" targetFramework="4.5"/> <!-- 通过 <authentication> 节,可以配置 ASP.NET 用于识别来访用户身份的 安全验证模式。 --> <authentication mode="Windows"/> <!-- 如果在执行请求的过程中出现未处理的错误, 则可以通过 <customErrors> 节 配置相应的处理步骤。具体来说, 开发人员可以通过该节配置 将取代错误堆栈跟踪显示的 HTML 错误页。 <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> </customErrors> --> <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/> </system.web> <system.webServer> <!-- 若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。 在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。 --> <directoryBrowse enabled="true"/> </system.webServer> <system.serviceModel> <services> <service name="WcfServiceCenter.Service1" behaviorConfiguration="WcfServiceCenter.Service1Behavior"> <!-- Service Endpoints --> <endpoint address="" binding="webHttpBinding" contract="WcfServiceCenter.IService1" behaviorConfiguration="HttpBehavior"></endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <host> <baseAddresses> <add baseAddress="http://localhost:10512/Service1.svc"/> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name="WcfServiceCenter.Service1Behavior"> <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false --> <serviceMetadata httpGetEnabled="true"/> <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 --> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="HttpBehavior"> <webHttp/> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel> </configuration>
wcf端核心代码
namespace WcfServiceCenter { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。 // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class Service1 : IService1 { public string GetData(int value) { return string.Format("You entered: {0}", value); } public CompositeType GetDataUsingDataContract(CompositeType composite) { if (composite == null) { throw new ArgumentNullException("composite"); } if (composite.BoolValue) { composite.StringValue += "Suffix"; } return composite; } BLL.UserClass uc = new BLL.UserClass(); [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] public string show_averageSalary_job(string city, string area) { DataTable dt = uc.show_averageSalary_job(city, area); return DataTableConvertJson.DataTable2Json(dt); } } }
客户端调用代码
function fn2()
$.ajax ({ url: "http://localhost:10512/Service1.svc/show_averageSalary_job", type: "POST", contentType: "text/json", data: '{"city":"武汉","area":"汉阳"}', dataType: "json", success: function (returnValue) { $("#lbl1").text(returnValue); }, error: function (error) { alert(error.statusText); } });
==========5月22号 分割线===============
跨越问题已经解决,非常感谢。新问题如下:
我把wcf部署之后,再次通过ajax的方式远程调用出现问题:
function fn2() { $.ajax({ //url: "http://localhost:10512/Service1.svc /show_averageSalary_job?jsoncallback=?", //访问localhost 访问vs中的服务,成功 //url: "http://192.168.1.52:10512/Service1.svc /show_averageSalary_job?jsoncallback=?", //通过IP 访问vs中的服务,失败 //url:"http://192.168.1.52/smallfish/Service1.svc /show_averageSalary_job?jsoncallback=?", //通过IP 访问IIS中的服务,失败(希望的目标访问方式) url:" http://localhost/smallfish/Service1.svc /show_averageSalary_job?jsoncallback=?", //通过localhost 访问IIS中的服务,失败 type: "get", crossDomain: true, contentType: "text/json", data: {city:"武汉",area:"汉阳"}, dataType: "json", success: function (returnValue) { $("#lbl1").text(returnValue); }, error: function (error) { alert(error.status); } }); }
需要注意的是,我的wcf部署确实是成功的,局域网内访问
http://192.168.1.52/smallfish/Service1.svc 是可以正确执行的。
我觉得肯定还是这个ajax调用的限制吧,或者是wcf中的某些配置问题吧。
wcf配置如下:
<?xml version="1.0"?> <configuration> <appSettings> <add key="SQLConnection" value="Data Source=.\AZZEXPRESS;Initial Catalog=smallfish;Integrated Security=True"/> <add key="PageSize" value="10"/> </appSettings> <connectionStrings/> <!-- 有关 .NET 4.5 的 web.config 更改的说明,请参见 http://go.microsoft.com/fwlink/?LinkId=235367。 可在 <httpRuntime> 标记上设置以下特性。 <system.Web> <httpRuntime targetFramework="4.5"/> </system.Web> --> <system.web> <compilation targetFramework="4.5"/> <!-- 通过 <authentication> 节,可以配置 ASP.NET 用于识别来访用户身份的 安全验证模式。 --> <authentication mode="Windows"/> <!-- 如果在执行请求的过程中出现未处理的错误, 则可以通过 <customErrors> 节 配置相应的处理步骤。具体来说, 开发人员可以通过该节配置 将取代错误堆栈跟踪显示的 HTML 错误页。 <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="NoAccess.htm"/> <error statusCode="404" redirect="FileNotFound.htm"/> </customErrors> --> <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/> </system.web> <system.webServer> <!-- 若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。 在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。 --> <directoryBrowse enabled="true"/> </system.webServer> <system.serviceModel> <services> <service name="WcfServiceCenter.Service1" behaviorConfiguration="WcfServiceCenter.Service1Behavior"> <!-- Service Endpoints --> <endpoint address="" binding="webHttpBinding" contract="WcfServiceCenter.IService1" bindingConfiguration="webBinding" behaviorConfiguration="webBehavior"></endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <host> <baseAddresses> <add baseAddress="http://localhost:10512/Service1.svc"/> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name="WcfServiceCenter.Service1Behavior"> <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false --> <serviceMetadata httpGetEnabled="true"/> <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 --> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="webBehavior"> <webHttp/> </behavior> </endpointBehaviors> </behaviors> <bindings> <webHttpBinding> <binding name="webBinding" crossDomainScriptAccessEnabled="true"> </binding> </webHttpBinding> </bindings> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"> <baseAddressPrefixFilters> <add prefix="string"/> </baseAddressPrefixFilters> </serviceHostingEnvironment> </system.serviceModel> </configuration>
不在同一个站点下面是需要跨域的,。
这里有一个小的sample, 希望能给楼主点启示
(function(){ //获取跨域数据 window.onmessage = function(e){ var url = "http://yangzebo.com/demo/noforget/test.php?msg=" + e.data; //Ajax var xhr = getXHR(); if(xhr){ xhr.open("GET",url,true); xhr.onreadystatechange = changeHandle; xhr.send(null); }else{ alert("不支持Ajax"); } function changeHandle(){//返回处理 if(xhr.readyState == 4){ var parentwin = window.parent; parentwin.postMessage(xhr.responseText,"*");//跨域发送数据 } } function getXHR(){//获取XMLHttpRequest var xhr_temp; if(window.XMLHttpRequest){ xhr_temp = new XMLHttpRequest(); }else if(window.ActiveXObject){ xhr_temp = new ActiveXObject("Microsoft.XMLHTTP"); }else{ xhr_temp = null; } return xhr_temp; } }; })();
有劳,我测试看看
@AzzStyle: 成, 如果有问题继续追问, 我尽量在线等(因为快下班了,在等媳妇电话一起下班), 如果没问题的话就请采纳吧 - -
@请叫我头头哥: 多谢,最后解决了,我写了博客记录了这个过程,希望新人少走弯路。http://www.cnblogs.com/zzPrince/p/4525017.html
@AzzStyle: 嗯, 这是一个好习惯, 如果能顺手把这个问题给结贴就更好了, 求采纳! :)
ajax与WCF是在同一个站点(http://localhost:10512)下吗?
同一个站点下是ok的,不是同一个站点下就不行
@AzzStyle: 不是同一个站点就跨域了,无法直接用ajax调用,要由本域的服务端中转一下。
@dudu: 能详细点吗
@AzzStyle: 如果可以使用http get方式进行请求,可以用jsonp进行跨域,参考:
@dudu: 多谢,我先自己测试下看看。
@AzzStyle: 多谢,最后解决了,我写了博客记录了这个过程,希望新人少走弯路。http://www.cnblogs.com/zzPrince/p/4525017.html
ajax 访问,抱的是什么错误呢?为什么认为是部署问题?