質問: WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class SampleClass : System.Web.Services.WebService { [WebMethod] public string SampleMethod(string name) { return "Hello World: " + name; } } ``` この中のSampleMethodを呼び出すHTMLファイルを作成したいのですが、いろいろ調べますと、 > > JavaScript から WebMethod を呼び出す方法 > > http://d.hatena.ne.jp/fyts/20071016/webmethod > > > JavaScriptからASP.NETのWebMethod(PageMethod)を呼び出す方法 > > http://little-braver.com/162/ > > > などの参考が見つかるのですが、これらはどうもあくまでもASP.netプロジェクト内でJavaScriptを使ってメソッドを呼び出す為の方法のように思えます。 上記のようなWebMethodを、全くの外部の、独立したHTMLファイル内にJavaScriptを記述して、呼び出すのに、何かサンプルHTML的なものをご教授願えないでしょうか? 例えば、 ``` SampleMethod呼び出し ``` このような形式で、ASP.netのWebメソッドを呼び出すには、どのように記述したらいいのでしょうか?
回答: 参考にされている記事の、前者は (1) Web サービス(.asmx)のクラスに ScriptService 属性を付与して Web サービスメソッドを JavaScript から呼び出せるようにしたもの、後者は (2) ページ(.aspx.cs)のメソッドを public static にして WebMethod 属性を付与し JavaScript から呼び出せるようにしたものてす。 質問者さんは (1), (2) のどちらを使いたいか分かりませんが、どちらも JavaScript で呼び出せます。つまり、記事のように ScriptManager を利用する ASP.NET AJAX を使わなくても、jQuery.ajax などでも呼び出せます。 自分のブログで何ですが、以下の記事は (1) の例で、Web サービスメソッドの呼び出しに ASP.NET AJAX を使っています。 ASP.NET AJAX と Web サービス http://surferonwww.info/BlogEngine/post/2011/06/04/ASPNET-AJAX-and-Web-Service.aspx それらの Web サービスメソッドには一切手を加えず、jQuery.ajax で呼び出すようにした例が以下の記事にありますので見てください。 jQuery AJAX と Web サービス http://surferonwww.info/BlogEngine/post/2011/06/04/jQuery-AJAX-and-Web-Service.aspx 以下の記事は (2) の例で、Web サービスメソッドの呼び出しに ASP.NET AJAX を使う方法と、jQuery.ajax を使う方法の両方が書いてあります。 ASP.NET AJAX でページの静的メソッド呼び出し http://surferonwww.info/BlogEngine/post/2012/08/18/aspnet-ajax-client-script-to-call-server-side-static-method-in-page.aspx なお、(1), (2) いずれも ajax を使っているので、基本的にクロスドメインでは呼び出せません。クロスドメインの場合は、以下の記事にあるような対応が必要になります。 JavaScript のクロス ドメイン (Cross-Domain) 問題の回避と諸注意 https://blogs.msdn.microsoft.com/tsmatsuz/2011/06/24/jsonp-cross-domain/ 上記の記事の対応策の一つ CORS (Cross-Origin Resource Sharing) の具体例が以下の記事にありますので、必要なら見てください。表題に WCF と書いてありますが、Web サービスでも同じ対応で可能なはずです。 クロスドメインの WCF サービス http://surferonwww.info/BlogEngine/post/2016/12/27/wcf-service-in-cross-domain.aspx