0

VS2005 と IIS6 を使用して Ajax Web サービスを開発しようとしています。その目的は、データベースにクエリを実行し、フィルター処理された MS Access テーブルに基づいて、レコードを text/csv (私の選択ではありません!) として返すことです。このサービスは、(Ajax および XMLHTTPRequest オブジェクトをサポートしている場合) 任意のクライアント ブラウザーからアクセスできる必要があり、最も可能性が高いのは Linux サーバーです。これには明らかに、クロスサイト HTTP リクエストの現象が関係しています。クライアントが MS IE 8 の場合、おそらくその Web ツールのセキュリティの平凡な実装のおかげで、大騒ぎせずに動作します。この問題は Firefox 12 で発生し、サービスの関数を呼び出すと HTTP/1.1 403 Forbidden が返されます。VB の Web サービス コードは次のとおりです。

Option Explicit On
Option Strict On

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports System.Web.Script.Services

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.Odbc


<System.Web.Services.WebService(Namespace:="http://chpt.co.uk/CastusDataTransport")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> <ScriptService()> _
Public Class TransferToolData
    Inherits System.Web.Services.WebService

    Const AccConStr As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data       Source=c:\inetpub\wwwroot\Castus_Server\App_Data\db1.mdb"

<WebMethod()> _
Public Function GetJobRecords(ByVal ClientID As Long) As String

    LogGrabJobData("Request for Job Data")

    Return GrabJobData(ClientID)
End Function

Private Function GrabJobData(ByVal ID As Long) As String

    Dim strData As String
    Dim MyDB As New OleDbConnection
    Dim drGet As OleDbDataReader
    Dim cmdRetrieve As New OleDbCommand
    Dim cs As String
    Dim RecCount As Long

    cs = AccConStr
    MyDB = New OleDbConnection(cs)
    cmdRetrieve.Connection = MyDB
    cmdRetrieve.CommandText = "SELECT * FROM Job_Data WHERE Client_ID = " & ID.ToString
    cmdRetrieve.Connection.Open()
    drGet = cmdRetrieve.ExecuteReader
strData = "’Job_ID’, ’Client_ID’, ’Status_ID’, ’Product_ID’, ’Serial_No’, ’Date_IN’, ’RA_Scale’, ’Location’, ’Manager’, ’Operator’, ’Stage’\n"

    RecCount = 0

    Do While (drGet.Read())
        strData &= Convert.ToString(drGet.Item("Job_ID")) & ","
        strData &= Convert.ToString(drGet.Item("Client_ID")) & ","
        strData &= Convert.ToString(drGet.Item("Status_ID")) & ","
        strData &= Convert.ToString(drGet.Item("Product_ID")) & ","
        'strData &= DelimitTextQuotes(Convert.ToString(drGet.Item("Client_Ref"))) & ","
        strData &= DelimitTextQuotes(Convert.ToString(drGet.Item("Serial_No"))) & ","
        strData &= Format(drGet.Item("Date_IN"), "d") & ","
        'strData &= DelimitTextQuotes(Convert.ToString(drGet.Item("Notes"))) & ","
        strData &= Convert.ToString(drGet.Item("RA_Scale")) & ","
        strData &= DelimitTextQuotes(Convert.ToString(drGet.Item("Location"))) & ","
        strData &= DelimitTextQuotes(Convert.ToString(drGet.Item("Manager"))) & ","
        strData &= DelimitTextQuotes(Convert.ToString(drGet.Item("Operator"))) & ","
        strData &= Convert.ToString(drGet.Item("Stage")) & "\n"

        RecCount += 1
    Loop

    Return strData
End Function

そして、クライアント側は最も平凡な方法でそれを呼び出します:

function makeCall(){        
    var xmlHttp;
try {
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                alert("This sample only works in browsers with AJAX support"); 
                return false;
            }
        }
    }

    // Create result handler 
    xmlHttp.onreadystatechange=function(){
        if(xmlHttp.readyState == 4){
            document.getElementById("result").value = xmlHttp.responseText;
        }
    }
         var url;
    url = "http://chpt.co.uk/Castus_Server/TransferToolData.asmx/GetJobRecords";
    var body = '{"ClientID":';
    body = body + document.getElementById("num1").value + '}';
    xmlHttp.open("POST", url, true);
    xmlHttp.setRequestHeader("Content-type", "application/json");
    xmlHttp.send(body);
}

クライアントからのプリフライト リクエストで 403 エラーが発生したようです (これは IE が単純にスキップすることに注意してください。これは、他のブラウザーが今すぐに自分自身を下げることを望む悪い設計上の欠陥です)。IIS Web アプリケーションは、次の HTTP ヘッダーを返すように構成されています。

Access-Control-Allow-Origin "*"
Access-Control-Allow-Headers  Origin,cache-control,man,messagetype,x-requested-with
Access-Control-Allow-Methods POST,OPTIONS

Firefox ブラウザー/サーバーは、次のヘッダーを送信します。

Request URL:
http://chpt.co.uk/Castus_Server/TransferToolData.asmx/GetJobRecords

Request Method:
OPTIONS

Status Code:
HTTP/1.1 403 Forbidden


Request Headers
15:05:03.984

  Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  Accept-Encoding:gzip, deflate
  Accept-Language:en-gb,en;q=0.5
  Access-Control-Request-Headers:content-type
  Access-Control-Request-Method:POST
  Cache-Control:no-cache
  Connection:keep-alive
  Host:chpt.co.uk
  Origin:null
  Pragma:no-cache
  User-Agent:Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0


Response Headers
?1984ms

   Access-Control-Allow-Headers:Origin,cache-control,man,messagetype,x-requested-with
   Access-Control-Allow-Methods:POST
   Access-Control-Allow-Origin:*
   Access-Control-Max-Age:120
   Content-Length:1827
   Content-Type:text/html
   Date:Thu, 17 May 2012 14:04:54 GMT
   MicrosoftOfficeWebServer:5.0_PubServer:Microsoft-IIS/6.0
   X-Powered-By:ASP.NET

今、私はこの主題に関する「聖書」の Web ページ [https://developer.mozilla.org/en/http_access_control#Access-Control-Allow-Methods][1] を読み、いくつかのことを学びましたが、解決策は知りませんでした。私の現在の問題に。誰かが私が間違っている場所を見つけたり、正しい方向に向けたりできるかどうか疑問に思いました. 皆さんを退屈させていないこと、そして私の苦境について十分な詳細を提供できたことを願っています.

4

1 に答える 1

0

誰もこれを知っているようには見えないので、これ以上時間を無駄にすることはできません (回避策を既に設計して提供しています)。この質問は終了します。ScriptService() Web サービスを使用する場合、クロスサイト HTTP リクエスト API に単純な問題があるように思われます。数か月後にこれをもう一度試して、問題が「すべて自然に」解決したかどうかを確認します! 解決策が見つかったら、ここで公開します... Jim McGoldrick cablesafe.co.uk

于 2012-06-12T13:02:07.397 に答える