1

VS2012、フレームワーク 4.5 を使用

WebService.asmx ファイルだけの単純な webapp があります。SetDataプロジェクトを実行すると、これら 2 つの webmethods が公開されますGetData。C# コードは次のとおりです。

[WebService(Namespace = "http://mydomain.com/")]
[System.Web.Script.Services.ScriptService]
public class WebService: System.Web.Services.WebService {

  [WebMethod(EnableSession=true)]
  [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
  public string SetData() {
      HttpContext.Current.Session["someData"] = "xxxxxxxxx";
      return "";
  }

  [WebMethod(EnableSession = true)]
  [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
  public string GetData() {
      if (HttpContext.Current.Session["someData"] == null)
          return "Session NULL";
      else
          return HttpContext.Current.Session["someData"].ToString();
  }
}

web.config は、CORS をaspNetCompatibilityEnabled有効にし、セッション共有も有効にするように設定されています。

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="null" />
      <add name="Access-Control-Allow-Headers" value="Content-Type" />
      <add name="Access-Control-Allow-Credentials" value="true" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>

したがって、プロジェクトは正常に実行されます。ここで、単純な HTML ページからこれら 2 つのメソッドを使用したいと考えています (HTML はASPNETプロジェクトの一部ではなく、単なる HTML ファイルです... したがって、CORS の問題です)。しかし、それはただの空のページです):

<script type="text/javascript">
    $(document).ready(function() {
        //jQuery.support.cors = true;
        $.ajax({
            type: "POST",
            url: "http://localhost:62776/WebService.asmx/SetData",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(msg) {
                alert('SetData OK');
                $.ajax({
                    type: "POST",
                    url: "http://localhost:62776/WebService.asmx/GetData",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    //async: true, -- makes no difference
                    //beforeSend: function(xhr){
                    //    xhr.withCredentials = true;
                    //},
                    success: function(msg) {
                        alert('GetData: ' + msg.d);
                    },
                    error: function(e){
                        alert("GetData: Unavailable");
                    }
                });

            },
            error: function(e){
                alert("SetData: Unavailable");
            }
        });
    });
</script>

HTML ページを実行すると、次のようSetData OKになりますGetData: Session NULLが、GetData: xxxxxx

だから私の質問は、どうすればSession ObjectCORS呼び出し間で同じものにアクセスできますか?

また、ASPNET AUTH COOKIES が AJAX 呼び出し間で正しいセッション ID を何らかの方法で保持すると考えて、認証を有効にしようとしましたが、うまくいきませんでした。SOAP エンベロープを使用して各 AJAX 呼び出しを認証し、セッション情報を送信する方法も考えられますが、それはやり過ぎのようです。

4

2 に答える 2

1

web.configファイルに次の追加を試みましたか

<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>

または、Web メソッドに次のコードを追加します。

[ScriptMethod(UseHttpGet = true)]
public string HelloWorld()
{
   return "Hello World";
}

これを使用してサービスを呼び出します (javascript):

function SendAjaxRequest(url) {

var xmlhttp = "";

if (window.XMLHttpRequest) {
    xmlhttp = new XMLHttpRequest();
} else {
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}

xmlhttp.open("GET", url, false);
xmlhttp.onreadystatechange = function () {
    //when response is ready
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        var rspText = xmlhttp.responseText;
        if (rspText != undefined) {
            // here is the response
            var json = JSON.parse(rspText);
        }
    }
}

   xmlhttp.send(null);
}

返されたデータがタグでラップされて削除され、データを取得するだけであることに気付いた場合は、次の関数を使用します。

function TrimXmlTag(start, responseText) {

   var from = responseText.indexOf(start),
       remaining = responseText.substring(from, responseText.length - 9);

   return remaining;
}

この行を変更するだけです:

 var json = JSON.parse(TrimXmlTag("[",rspText));

それが役に立てば幸い。

于 2013-08-01T16:44:01.053 に答える
1

withCredentials を設定する必要があります。これは、クライアントが暗黙的な「もの」(Cookie を含む) を送信することを望んでいることを意味します。

http://brockallen.com/2012/12/15/cors-and-windows-authentication/

また、「資格情報」を許可する必要がある場合、サーバーは特定のオリジンを要求する Access-Control-Allow-Origin で応答する必要があります。「*」は使用できません。

于 2013-07-28T05:38:37.283 に答える