首页 新闻 会员 周边

ajax调用wcf服务问题,很急!

0
悬赏园豆:100 [已解决问题] 解决于 2016-01-29 11:29

当我把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>

 

 

 

 

 

 

 

 

 

AzzStyle的主页 AzzStyle | 初学一级 | 园豆:60
提问于:2015-05-19 17:32
< >
分享
最佳答案
1

 不在同一个站点下面是需要跨域的,。

这里有一个小的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;  
    }  
  };  
})(); 
收获园豆:50
请叫我头头哥 | 大侠五级 |园豆:9382 | 2015-05-19 17:51

有劳,我测试看看

AzzStyle | 园豆:60 (初学一级) | 2015-05-19 18:09

@AzzStyle: 成,  如果有问题继续追问, 我尽量在线等(因为快下班了,在等媳妇电话一起下班), 如果没问题的话就请采纳吧 - -

请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-19 18:10

@请叫我头头哥: 多谢,最后解决了,我写了博客记录了这个过程,希望新人少走弯路。http://www.cnblogs.com/zzPrince/p/4525017.html

AzzStyle | 园豆:60 (初学一级) | 2015-05-23 22:05

@AzzStyle:  嗯, 这是一个好习惯, 如果能顺手把这个问题给结贴就更好了, 求采纳!   :)

请叫我头头哥 | 园豆:9382 (大侠五级) | 2015-05-25 14:28
其他回答(2)
0

ajax与WCF是在同一个站点(http://localhost:10512)下吗?

收获园豆:50
dudu | 园豆:31007 (高人七级) | 2015-05-19 17:36

同一个站点下是ok的,不是同一个站点下就不行

支持(0) 反对(0) AzzStyle | 园豆:60 (初学一级) | 2015-05-19 17:37

@AzzStyle: 不是同一个站点就跨域了,无法直接用ajax调用,要由本域的服务端中转一下。

支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2015-05-19 17:39

@dudu: 能详细点吗

支持(0) 反对(0) AzzStyle | 园豆:60 (初学一级) | 2015-05-19 17:40

@AzzStyle: 如果可以使用http get方式进行请求,可以用jsonp进行跨域,参考:

[jQuery]在WCF 4中如何用JSONP轻松实现跨域Ajax请求

支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2015-05-19 17:45

@dudu: 多谢,我先自己测试下看看。

支持(0) 反对(0) AzzStyle | 园豆:60 (初学一级) | 2015-05-19 18:08

@AzzStyle: 多谢,最后解决了,我写了博客记录了这个过程,希望新人少走弯路。http://www.cnblogs.com/zzPrince/p/4525017.html

支持(0) 反对(0) AzzStyle | 园豆:60 (初学一级) | 2015-05-23 22:05
0

ajax 访问,抱的是什么错误呢?为什么认为是部署问题?

| 园豆:780 (小虾三级) | 2015-05-26 22:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册