【问题标题】:Javascript Cross Domain WCF Self Hosted RestrictionsJavascript 跨域 WCF 自托管限制
【发布时间】:2012-10-28 02:04:28
【问题描述】:

我有一个有点独特的问题。我有一个静态 HTML 和 Javascript 页面,需要从 Javascript 调用 Web 服务。此 WCF Web 服务将作为 Windows 服务自托管在单独的服务器上。由于跨域限制,我在尝试在 javascript 页面和 Web 服务之间进行通信时遇到了问题。我已经看到了一些关于如何解决这个问题的示例,但是由于我的网页将是静态的并且不是从 IIS 提供的,所以我不确定如何去做。

我在下面附上了我的一些代码。任何帮助,将不胜感激。

App.Config

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

  <configSections>
  </configSections>
  <connectionStrings>
    <add name="test.XKORE.MobileDeviceServices.Properties.Settings.ConnectionString"
      connectionString="Data Source=tester;Initial Catalog=test;User ID=testc;Password=testp" />
  </connectionStrings>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="test.XKORE.MobileDeviceServices.XKOREMobileService" behaviorConfiguration="XKOREMobileServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8523/test/XKORE/XKOREMobileService" />
          </baseAddresses>
        </host>
        <endpoint address="" binding="basicHttpBinding" contract="test.XKORE.MobileDeviceServices.IXKOREMobileService" bindingNamespace="http://test.XKORE.MobileDeviceServices" />
        <endpoint address="mex" binding="mexHttpBinding" contract="test.XKORE.MobileDeviceServices.IXKOREMobileService" bindingNamespace="http://test.XKORE.MobileDeviceServices" />

      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="XKOREMobileServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

界面

[ServiceContract]
    public interface IXKOREMobileService
    {
        [OperationContract]
        string GetChartData();

        // TODO: Add your service operations here
    }

SOAP 请求

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IXKOREMobileService/GetChartData</Action>
  </s:Header>
  <s:Body>
    <GetChartData xmlns="http://tempuri.org/" />
  </s:Body>
</s:Envelope>

Javascript(不工作)

var response = BuildSOAPMessage('GetChartData');
alert(response);

function BuildSOAPMessage (func) {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("POST", "http://localhost:8523/test/XKORE/XKOREMobileService", false);

    var msg = '';
    msg += '<?xml version="1.0" encoding="utf-8"?>'
    msg += '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">'
    msg += '<soapenv:Header/>'
    msg += '<soapenv:Body>'
    msg += '<tem:' + func + '/>'
    msg += '</soapenv:Body>'
    msg += '</soapenv:Envelope>'
    alert (msg);

     // Send the POST request
     xmlhttp.setRequestHeader('Content-Type', 'text/xml');
     xmlhttp.setRequestHeader("SOAPAction", "http://tempuri.org/IXKOREMobileService/GetJSONChartData");
     xmlhttp.send(msg);

    return xmlhttp.responseXML;
}

【问题讨论】:

    标签: javascript xml wcf soap cross-domain


    【解决方案1】:

    您的问题不是唯一的...由于 CORS,您的 WS 调用失败了。

    因此,您必须通过实现IDispatchMessageInspector 在您的 WS 中设置 HTTP 标头“Access-Control-Allow-Origin”:

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        var httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty;
        if (httpResponse != null)
        {
            //CORS
            httpResponse.Headers["Access-Control-Allow-Origin"] = "*";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 1970-01-01
      • 2013-10-06
      • 2012-08-24
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多