3

2 つのイントラネット サイトがあります。

http://intranetv1/
http://intranetv2/

v1 は .NET 1.1 に基づいており、v2 は .NET 3.5 に基づいています。

v1 で Web ページを作成し、jQuery を使用して v2 で作成した Web サービスにアクセスしようとしています。Web サービスは .NET 3.5 を使用してコーディングされているため、v1 でその Web サービスを使用することはできません。

とにかく、この場合は JSONP を使用することになっていると思いますが、ページを実行するたびに ajax 部分が機能せず、Google Chrome ではキャンセルのように 500 エラー メッセージが表示されます。

なぜこれが起こっているのかわかりません。

v1 .NET 1.1 サーバーにある jQuery は次のとおりです。

function selectedDateTime(strDate, strHours, strMinutes) {

    $.ajax({
        type: 'POST',
        url: 'http://intranetv2/webservices/meetingrooms.asmx/GetDayCount',
        data: '{ strMeetingDate:"' + strDate + " " + strHours + ":" + strMinutes + ":00" + '" }',
        contentType: 'application/json; charset=utf-8',
        dataType: 'jsonp',
        success: function(department) {
            alert("success");
        },
        error: function(xhr, status, error) {
            alert("error");
        }
    });

    return strDate + "---" + $("#txtDate").val();

}

ご覧のとおり、v2 .NET 3.5 サーバー上の .asmx ファイルにアクセスしようとしています。

これを実行すると、Google Chrome で 500 サーバー エラーが発生し、asmx ファイルがキャンセルされたことが通知され、selectedDateTime 関数の最後に日付アラートを示すアラートが表示されます。したがって、関数は実行されていますが、ajax スクリプトの成功部分またはエラー部分はまったく実行されていません。


私は次の応答を得ています:

Request URL:http://intranetv2/webservices/meetingrooms.asmx/GetDayCount?callback=jQuery110100248512071557343_1372419413424&{%20strMeetingDate:%2228/06/2013%2006:00:00%22%20}&_=1372419413425
Request Method:GET
Status Code:500 Internal Server Error

Request Headers
GET /webservices/meetingrooms.asmx/GetDayCount?callback=jQuery110100248512071557343_1372419413424&{%20strMeetingDate:%2228/06/2013%2006:00:00%22%20}&_=1372419413425 HTTP/1.1
Host: intranetv3
Connection: keep-alive
Authorization: Negotiate TlRMTVNTUAADAAAAGAAYAHYAAAAYABgAjgAAABIAEgBIAAAABgAGAFoAAAAWABYAYAAAAAAAAACmAAAABYKIogUBKAoAAAAPQgBQAEMATwBMAEwASQBOAFMAaQB4AGYASQBYAEYALQBHAEIASgBUAEIAMgBKAJBkNIpqc7C+AAAAAAAAAAAAAAAAAAAAAIGOnhAoLt95s2HzXVTV7AvYOt1c9vbdJQ==
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
DNT: 1
Referer: http://intranetv1/meeting/meeting_room_bookings_2_1.aspx
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
Query String Parametersview sourceview URL encoded
callback:jQuery110100248512071557343_1372419413424
{ strMeetingDate:"28/06/2013 06:00:00" }:
_:1372419413425

Response Headers
HTTP/1.1 500 Internal Server Error
Date: Fri, 28 Jun 2013 11:36:57 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 406

Google Chrome デベロッパー ツールで表示されるエラー メッセージのスクリーンショットを次に示します 。ここに画像の説明を入力 完全な解像度を表示するには、ここをクリックしてください


.asmx コードは次のとおりです。

[WebMethod()]
public double GetDayCount(string strMeetingDate)
{
    string[] strDateAndTime = strMeetingDate.Split(' ');

    string[] strStartDateParts = strDateAndTime[0].Split('/');
    string[] srtStartTimeParts = strDateAndTime[1].Split(':');

    int year = Int32.Parse(strStartDateParts[2]);
    int month = Int32.Parse(strStartDateParts[1]);
    int day = Int32.Parse(strStartDateParts[0]);
    int hour = Int32.Parse(srtStartTimeParts[0]);
    int min = Int32.Parse(srtStartTimeParts[1]);
    int sec = Int32.Parse(srtStartTimeParts[2]);

    DateTime meetingDate = new DateTime(year, month, day, hour, min, sec);

    using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
    {

        using (command = new SqlCommand("intranet.dbo.BusinessHours", connection))
        {

            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.Add("@meeting_date", SqlDbType.DateTime).Value = meetingDate;

            connection.Open();

            using (reader = command.ExecuteReader())
            {
                reader.Read();
                return (double)reader["hours"];
            }
        }
    }
4

11 に答える 11

2

無効strDateな文字が含まれています。strDateしたがって、ajax リクエストを介して送信する前に、値をエンコードする必要があります。

更新ScriptMethod次のように Webメソッドをマークします

[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public double GetDayCount(string strMeetingDate){}

詳細については、これをお読みください

http://tutorials.cmsnsoftware.com/2011/01/how-to-call-csharp-function-in-ajax.html

于 2013-07-01T09:26:45.657 に答える
1

からコメントを削除

// [System.Web.Script.Services.ScriptService]

asmx.cs ページのこの行

お気に入り

 [System.Web.Script.Services.ScriptService]
于 2013-07-01T10:29:42.287 に答える
0

CORS を使用 (構成および実装) し、コンテンツを「application/xml」として送信します。

Cross Origin Resource Sharing (CORS) 仕様の出現により、現在 W3C 勧告の候補となっているため、Web アプリケーション開発者は、安全な方法で XmlHttpRequests を別のドメインに送信するためのブラウザー サポート メカニズムを利用できます。

http://techblog.constantcontact.com/software-development/using-cors-for-cross-domain-ajax-requests/

レビュー: CORS サポート クライアント (browsers/user-agents) http://enable-cors.org/client.html

レビュー: CORS サポート SERVER http://enable-cors.org/server.html

于 2013-07-07T18:27:45.010 に答える
0

クロスドメインの問題が発生している可能性があります。crossdomain.xml と clientaccesspolicy.xml のファイルを仮想ディレクトリ/website フォルダーに追加します。

crossdomain.xml のコード

  <?xml version="1.0"?>
  <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
  <cross-domain-policy>
  <allow-http-request-headers-from domain="*" headers="SOAPAction,Content-Type"/>
  </cross-domain-policy>

clientaccesspolicy.xml のコード

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
 <cross-domain-access>
  <policy>
   <allow-from http-request-headers="SOAPAction">
     <domain uri="*"/>
   </allow-from>
   <grant-to>
     <resource path="/" include-subpaths="true"/>
   </grant-to>
 </policy>
 </cross-domain-access>
</access-policy>

または、 http://msdn.microsoft.com/en-us/library/cc197955%28v=vs.95%29.aspxからこれらのファイルをダウンロードすることもできます。

編集 コードを細かく確認した後、問題は日付文字列の受け渡しにあることがわかりました。

あなたのコードによると、出力は次のようになります

'{ strMeetingDate:"2013/07/01 17:10:00" }'

以下のように日付文字列値を生成する必要がありますが

'{ "strMeetingDate":"07012013 17:10:00" }' または '{ strMeetingDate:07012013 17:10:00 }'

つまり、strMeetingDate プロパティは文字列型である必要があります。

これは、asmx サービスのヘルプを表示すると表示できます。これは、WCF サービスと同様にヘルプを提供します。

于 2013-07-01T10:10:19.623 に答える
0

両方のドメインを管理している場合は、同じベース ドメインで設定する方が簡単な場合があります。intraanetv1.mysite.com と intranetv35.mysite.com のように。次に、document.domain = mysite.com を設定して、同一オリジン ポリシーを緩和する必要があります。

もう 1 つのオプションは、クロス オリジン リソース シェアリング (CORS) です。これに関する記事は次のとおりです 。 http://www.adobe.com/devnet/html5/articles/understanding-cross-origin-resource-sharing-cors.html

于 2013-07-05T23:17:08.560 に答える
0

問題は日付形式にある可能性があります。

電話をかける前に のmm/dd/yyyy HH:MM:ss代わりに に変更してみてください。dd/mm/yyyy HH:MM:ss

于 2013-07-01T09:39:33.087 に答える
0

system.web内の web.config に以下を追加してみてください

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

また、パラメーターが見つからないというエラーが発生した場合は、データを次のように変更してみてください。

data: "strMeetingDate=" + strDate + " " + strHours + ":" + strMinutes + ":00",

これがうまくいくかどうか教えてください。

于 2013-07-01T10:41:20.933 に答える
0

両方のドメインを管理している場合は、同じベース ドメインで設定する方が簡単な場合があります。intraanetv1.mysite.com と intranetv35.mysite.com のように。次に、document.domain = mysite.com を設定して、同一オリジン ポリシーを緩和する必要があります。

于 2013-07-05T23:13:11.187 に答える