2012-12-26 11 views
15

localhost:80でホストされているjavascriptアプリケーションからPOST要求を許可しようとしていますが、別のポートでホストされているWCF REStfulサービスが何らかの理由で動作しません。ヘッダーにカスタムプロパティを追加しようとしましたが、プログラムのJSONDataメソッドにプログラムで追加しましたが、私の応答には '405メソッドが許可されません。'というメッセージが表示されます。ここで適切なアプローチは何ですか?WCFサービスにクロスドメインサポートを追加する方法

これは私のインターフェイスです:

namespace RestService 
{ 
    public class RestServiceImpl : IRestServiceImpl 
    { 
     #region IRestServiceImpl Members 

     public string JSONData() 
     { 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
      return "Your POST request"; 
     } 

     #endregion 
    } 
} 

とサービスコード:

using System.ServiceModel; 
using System.ServiceModel.Web; 
using System.Web.Script.Services; 

namespace RestService 
{ 

    [ServiceContract] 
    public interface IRestServiceImpl 
    { 
     [OperationContract] 
     [ScriptMethod] 
     [WebInvoke(Method = "POST", 
      ResponseFormat = WebMessageFormat.Json, 
      BodyStyle = WebMessageBodyStyle.Bare, 
      UriTemplate = "export")] 
     string JSONData(); 
    } 
} 

そして最後に設定:

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

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <services> 
     <service name="RestService.RestServiceImpl" behaviorConfiguration="ServiceBehaviour"> 
     <endpoint address ="" binding="webHttpBinding" contract="RestService.IRestServiceImpl" behaviorConfiguration="web"> 
     </endpoint> 
     </service> 
    </services> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehaviour"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="web"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <httpProtocol> 
     <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     </customHeaders> 
</httpProtocol> 
    </system.webServer> 

</configuration> 
+0

「何とかしても動作しない」ということを説明すると非常に良い質問になります。 –

+0

説明を更新しました。 –

答えて

17

これは、Web.configファイルのバージョンよりも私のためのより良い働いた:

Global.asaxを作成します。

このコードをtに追加する彼Global.asax.cs

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", "GET, POST"); 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
     HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000"); 
     HttpContext.Current.Response.End(); 
    } 
} 

http://www.dotnet-tricks.com/Tutorial/wcf/X8QN260412-Calling-Cross-Domain-WCF-Service-using-Jquery.html

+0

クール、まだここにいてくれてありがとう! –

+0

ありがとう!最終的には、多くを検索した後、正確な解決策を得ました。 – Vikrant

+0

これは最終的に数時間の研究の後に働きました。ありがとうbru! –

7

非GET要求に対してCORSを有効にするには、以上のものが必要Access-Control-Allow-Originヘッダーを設定するだけです -も処理する必要があります実際の要求が送信される前にデータを変更する可能性のある操作(POST、PUT、DELETEなど)を安全に実行することができるかどうかをサーバーに尋ねる要求であるOPTIONSリクエストである。

WCFのCORSサポートの追加に関するブログ記事を書いています。これは実装の中で最も簡単なことではありませんが、投稿のコードをプロジェクトに単純にコピー/貼り付けすることをお勧めします。投稿はhttp://blogs.msdn.com/b/carlosfigueira/archive/2012/05/15/implementing-cors-support-in-wcf.aspxにあります。

+0

それは私が必要とするものです。しかし、私はあなたがjsonとしてデータを送信するとうまくいかないことに気付きました。あなたのexabpleページは、POST要求と共に単一の文字列値を送信します。または、ExtJSがjQueryとは異なるリクエストデータを処理するためです:/ –

+0

例ではJSONとしてデータを送信します - POST/PUTメソッドへの入力は* JSON文字列です(入力は '' ''で囲まれています) – carlosfigueira

+0

テストページのデータを 'var data = { foo:" bar " }に変更しました。私は400の悪い要求を得ています。私はログをチェックしましたが、何も役立たないので、WCF自体を変更する必要がありますか? –

4

UPDATE:

があなたのWeb.configファイルにこれらのノードを追加します。

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

http://theagilecoder.wordpress.com/2014/07/07/wcf-and-cors-no-access-control-allow-origin-header-is-present-on-the-requested-resource/

+0

私にとって完璧に働いた! – FranP

0

次の.NETコード(Global.asaxのは)*の代わりに、これは上の認証を可能にするので元のドメインをエコーバックする方がよいことを重要な違いがありますCORS(例えば、 NTLM/Kerberos)とプリフライトをサポートしています。

void Application_BeginRequest(object sender, EventArgs e) 
{ 
    if (Request.HttpMethod == "OPTIONS") 
    { 
     Response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); 
     Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept"); 
     Response.AddHeader("Access-Control-Max-Age", "1728000"); 
     Response.End(); 
    } 
    else 
    { 
     Response.AddHeader("Access-Control-Allow-Credentials", "true"); 

     if (Request.Headers["Origin"] != null) 
      Response.AddHeader("Access-Control-Allow-Origin" , Request.Headers["Origin"]); 
     else 
      Response.AddHeader("Access-Control-Allow-Origin" , "*"); 
    } 
} 
関連する問題