トップ回答者
ADO.NET Data Services について

質問
-
明けましておめでとうございます。
年明け早々ですが、前に進めず困っております。
現在こちらのサイトを参考に進めていたのですが、エラーが発生して前に進めなく困っております。
ADO.NET Data Services用のAjaxがこちらのサイトからダウンロードして使ってくださいと指定がありました。
それで、進めていくと、次のようなエラーが発生しているようです。
server/webname/NorthwindClient.aspx
という感じでWebページを指定すると、先ほどのAjaxをつかって、サービスから指定したデータを取得するということなのですが、中身を知っている方ならわかると思いますが、
server/webname/Northwind.svc/Categories
という感じで指定すると、Categoriesが取得すべきデータということなのですが、エラー内容を見てみると、
webname\Northwind.svc\Categories
というディレクトリ構造でリソースを探しに行って、リソースが見つかりませんというようなエラーが発生しています。
実際にソース側の場所は、
var northwindService;
function pageLoad() {
northwindService = new Sys.Data.DataService("Northwind.svc");
query();
}function query() {
northwindService.query("Categories", cbQueryComplete); ←ここだと思われます
}上記の場所で、パスの解析でおかしい動きをしているのであると思うのです。
どなたか、回避方法をご存じの方いましたらよろしくお願いいたします。
なお、私の説明がどうもうまくないと思いますので、補足要求などありましたらお願いいたします。
回答
-
実際のサーバー/クライアント環境ではありませんが(その環境を持っていません)、IDE
の[ビルド]→[Web サイトの発行]で wwwroot ディレクトリに発行して、ローカル IIS 7.0
環境で試してみました。結果は以下の通りで、freemann さんの場合とはちょっと違いますが、やはり問題ありでした。
http://localhost/MsdnAdoNetDataService/Northwind.svc/ → HTTP 404.3 エラー
http://localhost/MsdnAdoNetDataService/NorthwindClient.aspx → データが表示されない「HTTP 404.3」でググって、一番怪しそうな下記の対処法を試したところ、とりあえず前者の
問題は解決されました。その理由や根拠等はまったく分かりませんが、よろしければお試しく
ださい。WCF を IIS でホストした場合に WCF サービスのアドレスに接続すると 404.3 エラーになったときの対処方法。
http://blogs.wankuma.com/katamari/archive/2008/01/27/119489.aspxしかしながら、後者の問題はまだ未解決です。何か分かったら連絡します。(挫折する可能性
が大なので、期待はしないでください) -
Sys.Data.DataService の引数を、サンプルのような /Northwind.svc ではな
く、以下のようにフルに記述したら問題はなくなり、データも完全に表示され
ました。Code Snippetfunction pageLoad() { // ページロード・イベント
// DataServiceオブジェクトの生成
northwindService = new Sys.Data.DataService("http://localhost/MsdnAdoNetDataService/Northwind.svc/");
query(); // ページロード後、サーバからデータ取得
}ちなみに、以下の部分はサンプルのまま、下記のようにしておかないと NG で
した。Code Snippetfunction query() { // データ取得関数
// Categoriesテーブルをクエリ。
// コールバックとしてcbQueryComplete関数を指定
northwindService.query("/Categories", cbQueryComplete);
}理由はまだ調べ切れておらず不明ですが、試してみてください。その前に
Northwind.svc/Categories でデータが取得できるようにする必要があります
が。
すべての返信
-
ASP.NET 開発サーバー上でしか試してませんが、こちらで試した限りでは参照され
ているサイト(下記)の手順どおりにして、エラーは一切発生しないことは確認できましたが?
RESTスタイルのWebサービスを手軽に公開する「ADO.NET Data Services」
http://www.atmarkit.co.jp/fdotnet/special/vs2008sp1ds/vs2008sp1ds_01.htmlNorthwind.svc/Categories の Categories の方は大文字小文字の区別がされるよ
うですが、その点は確認されましたか?例えば以下で、前者は OK、後者は HTTP 404 エラーになります。
http://localhost:49775/Northwind.svc/Categories
http://localhost:49775/Northwind.svc/categories
ちなみに、自分の環境は下記の通りです。
Vista SP1 + .NET 3.5 SP1 + VS2008 Pro SP1 + SQL Sever 2008 Exp
-
SurferOnWwwさん、お返事ありがとうございます。
私の環境は2通り試しています。
1)Vsita SP1 + .NET 3.5 SP1 + VS2008 Pro SP1 + WIndowsServer2003 + SQL Server 2005
2)Vista SP1 + .NET 3.5 SP1 + VS2008 Pro SP1 + SQL Server 2008 Exp
です。
1の方ではIISは6.0です。
IDEでF5を押してのASP.NET 開発サーバー上では1,2ともにエラーがなく、動いてくれます。
が、開発サーバーじょうではなく、
という感じで、ブラウザで指定すると、エラーが発生しております。
例えば、
http://server/webname/Northwind.svc/ → 404エラー
http://server/webname/NorthwindClient.aspx → 実行時エラー*
*のエラー内容を見ようとデバッガを起動すると環境1では文字化けで内容が見れないということで、環境2でやってみると、質問内容のようにどうもパスの解析が間違っているととれる内容でした。
確かにご指摘の通り、大文字小文字の違いを認識するようで、ASP.NET開発サーバー上では間違うとデータを取ってきてくれません。
また、何か確認したい事項がありましたらおっしゃってくれれば随時お答えしたいと思います。
よろしくお願いいたします。
-
実際のサーバー/クライアント環境ではありませんが(その環境を持っていません)、IDE
の[ビルド]→[Web サイトの発行]で wwwroot ディレクトリに発行して、ローカル IIS 7.0
環境で試してみました。結果は以下の通りで、freemann さんの場合とはちょっと違いますが、やはり問題ありでした。
http://localhost/MsdnAdoNetDataService/Northwind.svc/ → HTTP 404.3 エラー
http://localhost/MsdnAdoNetDataService/NorthwindClient.aspx → データが表示されない「HTTP 404.3」でググって、一番怪しそうな下記の対処法を試したところ、とりあえず前者の
問題は解決されました。その理由や根拠等はまったく分かりませんが、よろしければお試しく
ださい。WCF を IIS でホストした場合に WCF サービスのアドレスに接続すると 404.3 エラーになったときの対処方法。
http://blogs.wankuma.com/katamari/archive/2008/01/27/119489.aspxしかしながら、後者の問題はまだ未解決です。何か分かったら連絡します。(挫折する可能性
が大なので、期待はしないでください) -
SurferOnWwwさん、再度の返信ありがとうございます。
教えていただいた、サイトを参考にしたところ、Vista上でのIIS7.0では
http://server/webName/Northwind.svc/ での指定はではエラーが出ず取得できているようです。
しかし、
http://server/webName/Northwind.svc/Customers という具合に指定すると内部エラー500が発生しているようです。
このエラー内容を取得したくて色々調べていたのですが、エラーの詳細をブラウザに取得できるのはWindowsServer2008でのIISでないと無理そうなので、2008は持っていないので、コードで後ほど調べてみようと思います。
そして、質問での環境1)の場合では、
http://msdn.microsoft.com/ja-jp/library/aa751792(VS.80).aspx
に書いてあることをコマンドラインで実行したのですが、Northwind.svcを指定した時は変わらず404エラーのままです。
それと、前のレスで私の方で誤解を生む記述があったようで、
http://server/webName/NorthwindClient.aspx
の場合は、データの取得が出来なくて埋め込んであるコントロールだけが表示されます。ただ、スクリプトのデバッグを有効にしているためだと思うのですが、エラーが発生していることがわかり、そこでデバッガを起動するとパスの解析がおかしい感じであるというところに行きついたということです。
また、何かありましたら、よろしくお願いいたします。
-
2) の方は同じ環境のようですが、結果は違う(Northwind.svc/Customers のときはエ
ラー)ということでしょうか? Northwind.svc/Categories もダメですか? とすると、ま
ずその問題の解決が先決だと思いますが、すみませんが、解決策は見当つきません。
自分の環境では Northwind.svc/Categories でも Northwind.svc/Categories でもデータを取得できますが、NorthwindClient.aspx ではデータが表示されないという状況
です。
デバッガで追いかけてみましたが、以下の northwindService.query が失敗してデー
タが取得できず、cbQueryComplete メソッド(データをブラウザに表示する)まで行か
ないという感じです。
Code Snippetfunction query() { // データ取得関数
// Categoriesテーブルをクエリ。
// コールバックとしてcbQueryComplete関数を指定
northwindService.query("/Categories", cbQueryComplete);
}DataService.js, DataService.debug.js を解析する時間も能力もなくて挫折しかかっ
ています。(笑)
-
Sys.Data.DataService の引数を、サンプルのような /Northwind.svc ではな
く、以下のようにフルに記述したら問題はなくなり、データも完全に表示され
ました。Code Snippetfunction pageLoad() { // ページロード・イベント
// DataServiceオブジェクトの生成
northwindService = new Sys.Data.DataService("http://localhost/MsdnAdoNetDataService/Northwind.svc/");
query(); // ページロード後、サーバからデータ取得
}ちなみに、以下の部分はサンプルのまま、下記のようにしておかないと NG で
した。Code Snippetfunction query() { // データ取得関数
// Categoriesテーブルをクエリ。
// コールバックとしてcbQueryComplete関数を指定
northwindService.query("/Categories", cbQueryComplete);
}理由はまだ調べ切れておらず不明ですが、試してみてください。その前に
Northwind.svc/Categories でデータが取得できるようにする必要があります
が。 -
SurferOnWwwさん、何度もご返信してくださりありがとうございます。
私の方はやはり、
http://server/webname/Northwind.svc/Customers
という指定で内部エラー500が発生しており、進んでおらず、せっかくの助言も検証できていないところです。
この内部エラーがGlobal.asaxでのエラーイベントでフック出来なくて(設定が悪いのか?)、ほとほと困り果てております。
もうしばらく、色々試してみたいと思います。
-
SurferOnWwwさん、解決しました。単純なことでした。それと、
エラー内容はイベントビューアの方にしっかりと載ってました。(ただ、エラーとしてではなく情報としてでした汗)
まず、http://localhost/webname/Northwind.svc/Customers
で内部エラーは・・・SQLServerでのアクセス権が設定されていませんでした。
権限を与えることにより出来ました。
続きまして、サービスを作成するときにフルで指定してあげるということでしたが、私の環境ではlocalhostで自サーバを指定すると、サービス名のパスの指定がおかしくなったので、localhostを使用せず、サーバ名で指定することにより解決できました。
長く付き合っていただきありがとうございました。