1

クライアント側から AJAX を使用して JSON オブジェクトを WCF サービスに渡したいと思います。Internet Explorer ではすべて正常に動作しますが、firefox では動作しません。

Firefox で405:Method not allowed が表示される

これは、(クライアント スクリプトから) json データを WCF サービスに渡す場所です...

    $(document).ready(function () {
        var Author = '{ "Id": "A01", "Name": "Ravinder" }';
        $.ajax({
            type: "POST",
            data: JSON.stringify(Author),
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: "http://localhost:53905/Service1.svc/AuthorPostByJson",
            success: function (data) {
                alert("success");
            },

            error: function (xmlhttprequest, textstatus, errorthrown) {
                alert(" failed ");
                console.log("error: " + errorthrown);
            }
         });//end of $.ajax
    });

私のWCFサービスは...

     [OperationContract]
            [WebInvoke(Method = "POST",
                UriTemplate = "AuthorPostByJson", 
                ResponseFormat = WebMessageFormat.Json, 
                RequestFormat = WebMessageFormat.Json)]       
            List<Book> GetBooksByAuthor_JSON(Author author);

私の web.config ファイル ....

  <system.serviceModel>
    <services>
      <service behaviorConfiguration="Platform.WebRestful.Service1Behavior"
        name="Platform.WebRestful.Service1">
        <endpoint address="" binding="basicHttpBinding" contract="Platform.WebRestful.IService1">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
      <service behaviorConfiguration="Platform.WebRestful.BookServiceHostRestfulBehavior"
        name="Platform.WebRestful.BookServiceHostRestful">
        <endpoint address="" binding="webHttpBinding" contract="Platform.WebRestful.IBookServiceHostRestful">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Platform.WebRestful.Service1Behavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
        <behavior name="Platform.WebRestful.BookServiceHostRestfulBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
   <endpointBehaviors>
    <behavior name="web">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
4

1 に答える 1

1

最後に、いくつかの記事で答えを見つけました。彼らは、クロスドメイン(サイト)HTTPリクエスト全体で、最初のブラウザが「プリフライトリクエスト」と呼ばれる「OPTIONS」リクエストを送信すると述べました...「プリフライト」リクエストは、最初にHTTP OPTIONSリクエストヘッダーを他のドメインのリソースに送信します。実際のリクエストが安全に送信できるかどうかを判断するために、このリクエストは、サービスがレスポンスとしてサービスへのアクセスを許可していることを示す適切なヘッダーを期待しています

これを実現するには、2 つの解決策があります... 1) WCF カスタム動作 2) Global.asax ファイルの Application_BeginRequest イベントを変更します。

私は2番目のものに従いました...解決策は、Global.asaxファイルをWCfサービスプロジェクトに追加し、

following code in that,then it perfectly works across any browser...

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("Cache-Control", "no-cache");
                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();
            }
        }
于 2013-10-04T12:36:09.003 に答える