かんたんASP.NET - リスト

第10章 ASP.NET Webサービス


リスト 10-1 Service.asmxファイル

<%@ WebService Language="vb" CodeBehind="~/App_Code/Service.vb" Class="Service" %>

<%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="Service" %>

↑Top


リスト 10-2 分離コードファイル

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols

' この Web サービスを、スクリプトから ASP.NET AJAX を使用して呼び出せる
ようにするには、次の行のコメントを解除します。
' <System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
  Inherits System.Web.Services.WebService

  <WebMethod()> _
  Public Function HelloWorld() As String
    Return "Hello World"
  End Function

End Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// この Web サービスを、スクリプトから ASP.NET AJAX を使用して呼び出せるようにするには、次の行のコメントを解除します。 
// [System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{
  public Service()
  {

    //デザインされたコンポーネントを使用する場合、次の行をコメントを解除してください 
    //InitializeComponent(); 
  }

  [WebMethod]
  public string HelloWorld()
  {
    return "Hello World";
  }

}

↑Top


リスト 10-3 Webサービスメソッド呼び出し

Dim svc As New MyService.Service()
Dim str As String = svc.HelloWorld()

MyService.Service svc = new MyService.Service();
string str = svc.HelloWorld();

↑Top


リスト 10-4 WebサービスでのSoapExceptionのスロー

Dim doc As New XmlDocument()

' SoapException.Detailプロパティに設定するXmlNode
Dim detailNode As XmlNode = doc.CreateNode( _
  XmlNodeType.Element _
  , SoapException.DetailElementName.Name _
  , SoapException.DetailElementName.Namespace)

'XmlNodeに独自の情報を設定
detailNode.InnerXml = "<myItem>独自の情報</myItem>"

' SoapExceptionを作成してThrow
Throw New SoapException( _
  "独自のエラーメッセージ" _
  , SoapException.ServerFaultCode _
  , Context.Request.Url.AbsoluteUri _
  , detailNode)

XmlDocument doc = new XmlDocument();

// SoapException.Detailプロパティに設定するXmlNode
XmlNode detailNode = doc.CreateNode(
  XmlNodeType.Element
  , SoapException.DetailElementName.Name
  , SoapException.DetailElementName.Namespace);

// XmlNodeに独自の情報を設定
detailNode.InnerXml = "<myItem>独自の情報</myItem>";

// SoapExceptionを作成してthrow
throw new SoapException(
  "独自のエラーメッセージ"
  , SoapException.ServerFaultCode
  , Context.Request.Url.AbsoluteUri
  , detailNode);

↑Top


リスト 10-5 リスト10-4で設定されるXML

<detail>
  <myItem>
    独自の情報
  </myItem>
</detail>

↑Top


リスト 10-6 WebサービスクライアントでのSoapExceptionのキャッチ

Try
  ' プロキシクラスのインスタンス作成
  Dim svc As New MyService.Service()
  ' Webサービス呼び出し
  Dim str As String = svc.HelloWorld()

Catch ex As SoapException ' SoapExceptoinのみをキャッチ
  Dim message As String = ex.Message

  ' Detailプロパティを取得
  Dim detail As XmlNode = ex.Detail
  Dim myItemValue As String = ""

  ' Detailプロパティに情報が設定されていれば取得する
  If detail.HasChildNodes Then
    Dim myItem As XmlElement = detail("myItem")
    myItemValue = myItem.InnerText
  End If

  Label1.Text = message & "<br>" & myItemValue
End Try

try
{
  // プロキシクラスのインスタンス作成
  var svc = new MyService.Service();
  // Webサービス呼び出し
  string str = svc.HelloWorld();
}
catch (SoapException ex)
{
  string message = ex.Message;

  // Detailプロパティを取得
  XmlNode detail = ex.Detail;
  string myItemValue = "";

  // Detailプロパティに情報が設定されていれば取得する
  if (detail.HasChildNodes)
  {
    XmlElement myItem = detail["myItem"];
    myItemValue = myItem.InnerText;
  }

  Label1.Text = message + "<br>" + myItemValue;
}

↑Top


リスト 10-7 Service.vbファイル

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Xml

' この Web サービスを、スクリプトから ASP.NET AJAX を使用して呼び出せるようにするには、次の行のコメントを解除します。
' <System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://example.com/masaru/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class Service
  Inherits System.Web.Services.WebService

  <WebMethod()> _
  Public Function WhatTimeIsItNow(ByVal userName As String) As String
    ' 引数のチェック
    If String.IsNullOrEmpty(userName) Then
      Dim doc As New XmlDocument()
      ' SoapException.Detailプロパティに設定するXmlNode
      Dim detailNode As XmlNode = doc.CreateNode( _
      XmlNodeType.Element _
      , SoapException.DetailElementName.Name _
      , SoapException.DetailElementName.Namespace)
      ' XmlNodeに独自の情報を設定
      detailNode.InnerXml =  "<argName>userName</argName>"
      ' 独自にSoapExceptionを作成してThrow
      Throw New SoapException( _
      "引数が設定されていません" _
      , SoapException.ClientFaultCode _
      , Context.Request.Url.AbsoluteUri _
      , detailNode)
    End If

    Return String.Format( _
      "ようこそ {0} さん、現在の時刻は {1} です。" _
      , userName _
      , DateTime.Now.ToString("H 時 m 分 s 秒") _
    )
  End Function
End Class

using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml;

[WebService(Namespace = "http://example.com/masaru/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// この Web サービスを、スクリプトから ASP.NET AJAX を使用して呼び出せるようにするには、次の行のコメントを解除します。 
// [System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{
  [WebMethod]
  public string WhatTimeIsItNow(string userName)
  {
    // 引数のチェック
    if (String.IsNullOrEmpty(userName))
    {
      XmlDocument doc = new XmlDocument();
      // SoapException.Detailプロパティに設定するXmlNode
      XmlNode detailNode = doc.CreateNode(
        XmlNodeType.Element
        , SoapException.DetailElementName.Name
        , SoapException.DetailElementName.Namespace);
      // XmlNodeに独自の情報を設定
      detailNode.InnerXml = "<argName>userName</argName>";
      // 独自にSoapExceptionを作成してthrow
      throw new SoapException(
        "引数が設定されていません"
        , SoapException.ServerFaultCode
        , Context.Request.Url.AbsoluteUri
        , detailNode);
    }

    return String.Format(
      "ようこそ {0} さん、現在の時刻は {1} です。"
      , userName
      , DateTime.Now.ToString("H 時 m 分 s 秒")
      );
  }
}

↑Top


リスト 10-8 Default.aspxファイル

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Webサービス呼び出し</title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:Label ID="UserNameLabel" runat="server"
      Text="ユーザー名"></asp:Label>
    <asp:TextBox ID="UserNameTextBox" runat="server">
    </asp:TextBox>
    <asp:Button ID="ExecuteButton" runat="server"
      Text="Webサービス実行" />
    <hr />
    <asp:Label ID="ResultLabel" runat="server">
    </asp:Label>
  </div>
  </form>
</body>
</html>

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
  <title>Webサービス呼び出し</title>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <asp:Label ID="UserNameLabel" runat="server"
      Text="ユーザー名"></asp:Label>
    <asp:TextBox ID="UserNameTextBox" runat="server">
    </asp:TextBox>
    <asp:Button ID="ExecuteButton" runat="server"
      Text="Webサービス実行" onclick="ExecuteButton_Click" />
    <hr />
    <asp:Label ID="ResultLabel" runat="server">
    </asp:Label>
  </div>
  </form>
</body>
</html>

↑Top


リスト 10-9 Default.aspx.vbファイル

Imports System.Web.Services.Protocols
Imports System.Xml

Partial Class _Default
    Inherits System.Web.UI.Page

  Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ExecuteButton.Click
    Try
      ' プロキシクラスのインスタンス作成
      Dim svc As New WhatTimeIsItNowService.Service()
      ' Webサービス呼び出し
      ResultLabel.Text = svc.WhatTimeIsItNow(UserNameTextBox.Text)

    Catch ex As SoapException ' SoapExceptoinのみをキャッチ
      Dim message As String = ex.Message

      ' Detailプロパティを取得
      Dim detail As XmlNode = ex.Detail
      Dim argName As String = ""
      ' Detailプロパティに情報が設定されていれば取得する
      If detail.HasChildNodes Then
        Dim myItem As XmlElement = detail("argName")
        argName = myItem.InnerText
      End If

      ' 例外の詳細を表示
      ResultLabel.Text = String.Format( _
        "{0}<br>引数名:{1}" _
        , message _
        , argName)
    End Try
  End Sub
End Class

using System;
using System.Web.Services.Protocols;
using System.Xml;

public partial class _Default : System.Web.UI.Page
{
  protected void ExecuteButton_Click(object sender, EventArgs e)
  {
    try
    {
      // プロキシクラスのインスタンス作成
      var svc = new WhatTimeIsItNowService.Service();
      // Webサービス呼び出し
      ResultLabel.Text = svc.WhatTimeIsItNow(UserNameTextBox.Text);
    }
    catch (SoapException ex)
    {
      string message = ex.Message;

      // Detailプロパティを取得
      XmlNode detail = ex.Detail;
      string argName = "";

      // Detailプロパティに情報が設定されていれば取得する
      if (detail.HasChildNodes)
      {
        XmlElement myItem = detail["argName"];
        argName = myItem.InnerText;
      }

      // 例外の詳細を表示
      ResultLabel.Text = String.Format(
        "{0}<br>引数名:{1}"
        , message
        , argName);
    }
  }
}

↑Top