2016-05-04 5 views
1

ich diese Störung erhalte, wenn eine WCF-Dienst Cross-Domain zu konsumieren versucht:WCF CORS ist gesetzt, aber noch immer keine "Access-Control-Allow-Origin-Header vorhanden ist

XMLHttpRequest nicht https://MyDomain/MyService.svc/GetData laden. Die Antwort auf die Preflight-Anforderung übergibt die Zugriffskontrollprüfung nicht: Auf der angeforderten Ressource ist kein Header "Access-Control-Allow-Origin" vorhanden. Ursprung 'https://CallingDomain' ist daher nicht erlaubt. Die Antwort hatte HTTP-Statuscode 500.

Ich habe bereits CORS Zugriff in der Datei web.config einrichten wie so:

<httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*"/> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT" /> 
     <add name="Access-Control-Allow-Headers" value="Content-Type, Accept"/> 
     </customHeaders> 
    </httpProtocol> 

Hier ist meine vollständige Datei web.config:

 <?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <section name="MyService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> 
    </sectionGroup> 
    </configSections> 


    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    </appSettings> 

    <system.web> 
    <customErrors mode="Off"/> 
    <compilation targetFramework="4.5" debug="true"/> 
    <httpRuntime targetFramework="4.5"/> 
    <pages controlRenderingCompatibilityVersion="4.0"/> 
    <webServices> 
     <protocols> 
     <add name="HttpPost" /> 
     <add name="HttpSoap" /> 
     <add name="HttpGet" /> 
     </protocols> 
    </webServices> 
    </system.web> 
    <!-- Diagnostics Configuration--> 
    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel.MessageLogging" switchValue="Error,ActivityTracing"> 
     <listeners> 
      <add type="System.Diagnostics.DefaultTraceListener" name="Default"> 
      <filter type=""/> 
      </add> 
      <add name="ServiceModelMessageLoggingListener"> 
      <filter type=""/> 
      </add> 
     </listeners> 
     </source> 
    </sources> 
    <sharedListeners> 
     <add initializeData="E:\MyErrorFile.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp"/> 
    </sharedListeners> 
    <trace autoflush="true"/> 
    </system.diagnostics> 
    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/> 
    <add key="MajorVersion" value="1"/> 
    <add key="MinorVersion" value="1"/> 
    </appSettings> 
    <system.serviceModel> 


    <extensions> 
    <behaviorExtensions> 
     <add 
     name="crossOriginResourceSharingBehavior" 
     type="MyNameSpace.CORSEnablingBehavior, MyNameSpace, Version=1.0.0.0, Culture=neutral" /> 
    </behaviorExtensions> 
    </extensions> 


    <services> 
     <service name="MyNameSpace.MyService" behaviorConfiguration="ServiceBehaviour"> 
     <endpoint address="" binding="webHttpBinding" contract="MyNameSpace.MyService" behaviorConfiguration="web"/> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 

     </service> 
    </services> 
    <bindings> 
     <webHttpBinding> 
     <binding name="webHttpBinding"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="None" /> 
      </security> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehaviour"> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="web"> 
      <webHttp/> 
      <crossOriginResourceSharingBehavior /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </protocolMapping> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/> 
    <standardEndpoints> 
     <webScriptEndpoint> 
     <standardEndpoint name="" crossDomainScriptAccessEnabled="true" /> 
     </webScriptEndpoint> 
    </standardEndpoints> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 


    <directoryBrowse enabled="true"/> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*"/> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT" /> 
     <add name="Access-Control-Allow-Headers" value="Content-Type, Accept"/> 
     </customHeaders> 
    </httpProtocol> 
    </system.webServer> 
</configuration> 

Hier ist meine MyService.svc.cs Datei:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.ServiceModel.Web; 
using System.Text; 
using System.ServiceModel.Activation; 

namespace MyNameSpace 
{ 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]  
    [ServiceContract] 
    public class MyService 
    {   
     [WebInvoke(Method = "POST", 
        ResponseFormat = WebMessageFormat.Json, 
        BodyStyle = WebMessageBodyStyle.Bare, 
        UriTemplate = "/GetData" 
        )] 
     [OperationContract] 
     public TestData GetData(string value) 
     { 
      TestData tsd = TestData.GetTestData(value); 

      return tsd; 
     } 
    } 
} 

Hier die ist Ajax Ich bin mit dem Service aus einer anderen Domäne zu konsumieren:

function CallService() { 
       var params = new Object(); 
       params.value = "1234"; 

       var url = "https://ServiceURL/MyService.svc/GetData"; 

       $.ajax({ 
        type: "POST", 
        contentType: "application/json;charset=utf-8",       
        url: url,       
        data: JSON.stringify(params),       
        dataType: "json", 
        success: function (response) { 
         var results = response.d; 

         $.each($(results), function (key, value) { 
          alert(value.Last_Name + " " + value.First_Name); 
         }); 

        }, 
        error: function (a, b, c) { 

         var warnmsg = "Unable to call service: " + a.responseText; 
         alert(warnmsg); 

        } 
       }); 

      } 

ich selbst auch versucht haben, wie so CORS durch eine global.asax-Datei einrichten:

protected void Application_BeginRequest(object sender, EventArgs e) 
    {    
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
     if (HttpContext.Current.Request.HttpMethod == "OPTIONS") 
     { 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, PUT, DELETE"); 

      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
      HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
      HttpContext.Current.Response.End(); 
     } 
    } 

Kann jemand Ahnung mich in zu Was fehlt mir hier, um diesen Service von einer anderen Domain aus anzurufen?

Antwort

0

Wir lösen dieses Problem, indem eine leere Methode zum MyService.svc.cs Datei, wie so hinzufügen:

[OperationContract] 
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")] 
void GetOptions() { } 

wir auch eine RequestFormat zum WebInvoke der GetData POST-Methode wie folgt hinzugefügt:

[WebInvoke(Method = "POST", 
        ResponseFormat = WebMessageFormat.Json, 
        BodyStyle = WebMessageBodyStyle.WrappedRequest, 
        RequestFormat = WebMessageFormat.Json 
        )] 
     [OperationContract] 
     public TestData GetData(string value) 
     { 
      TestData tsd = TestData.GetTestData(value); 

      return tsd ; 
     } 
Verwandte Themen