Webサービス、Web API、WCFの呼び出し方法

  1. Webサービスの呼び出し方法

Webサービスは、プラットフォームに依存しない、低結合の、自己完結型のWebベースのアプリケーションです。公開されたXML標準を使用して記述、公開、発見、調整、および構成できます。分散型の相互運用可能なアプリケーションの開発に使用されます。

Webサービス技術により、異なるマシン上で実行されている異なるアプリケーションは、追加の専用のサードパーティーソフトウェアやハードウェアを介さずにデータを交換したり統合したりできます。Webサービス仕様に基づいて実装されたアプリケーション間では、使用している言語、プラットフォーム、または内部プロトコルに関係なく、データを相互に交換できます。

Webサービスは自己記述的で、ネットワーク経由で利用可能なモジュールであり、具体的なビジネス機能を実行できます。Webサービスは、XML、HTTPなどの産業標準や既存の技術に基づいているため、簡単に展開できます。

Webサービスを呼び出す方法には以下のものがあります:

  1. フロントエンドからの呼び出し:AJAXを使用
  2. バックエンドからの呼び出し:サービス参照の追加
  3. 公安システムとの連携:アプリケーションが自社のWebサービスをAJAXで呼び出し、そのWebサービスが公安のインターフェースを呼び出すことで、データ同期を実現

Webサービスが公安のインターフェースを呼び出す際は、HttpWebRequestクラスを使用してリクエストを送信し、HttpWebResponseで応答を取得します。

public static bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
    //常に受け入れる
    return true;
}

public static string CallPoliceApi(string endpoint, string token, string postData)
{
    var encryptionHelper = new EncryptionHelper();
    var policeModel = new PoliceModel();
    var rsaProcessor = new RsaProcessor();

    string result;
    string publicKey = ConfigurationManager.AppSettings["publicKey"];
    string privateKey = ConfigurationManager.AppSettings["privateKey"];
    string appId = ConfigurationManager.AppSettings["appId"];
    string appSecret = ConfigurationManager.AppSettings["appSecret"];
    string randomKey = Guid.NewGuid().ToString("N");
    string timestamp = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString();
    string rawString = "appId=" + appId + "&appSecret=" + appSecret + "&randomKey=" + randomKey + "&timestamp=" + timestamp;
    string signature = encryptionHelper.Sha256Encrypt(rawString);
    string encryptedBody = rsaProcessor.Encrypt(appSecret, publicKey);

    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateCertificate);
    var request = (HttpWebRequest)WebRequest.Create(endpoint);
    request.Headers.Add("appId", appId);
    request.Headers.Add("randomKey", randomKey);
    request.Headers.Add("timestamp", timestamp);
    request.Headers.Add("signature", signature);

    if (endpoint != "https://100.16.7.12/dev/hotelindustry/public/index.php/api/Server/getToken")
    {
        request.Headers.Add("token", token);
    }

    request.Method = "POST";
    request.Timeout = 5000;
    request.ContentType = "raw";
    byte[] data = Encoding.UTF8.GetBytes(postData);
    request.ContentLength = data.Length;
    
    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(data, 0, data.Length);
        requestStream.Close();
    }
    
    var response = (HttpWebResponse)request.GetResponse();
    Stream stream = response.GetResponseStream();
    
    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
    {
        result = reader.ReadToEnd();
    }
    
    return rsaProcessor.Decrypt(result, privateKey);
}
  1. Web APIの呼び出し方法

Web APIは、HTTPプロトコルを使用してリソースを操作するための軽量なインターフェースです。RESTfulアーキテクチャに基づいて設計されています。

Web APIを呼び出す方法:

  1. フロントエンドからの呼び出し:AJAXを使用
  • GET:データの取得
  • POST:新規作成
  • PUT:更新
  • DELETE:削除
  1. バックエンドからの呼び出し:HttpClientクラスを使用

GET操作の例:

public ActionResult Index()
{
    var client = new HttpClient();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
    var response = client.GetAsync("http://localhost:16947/api/Products").Result;
    var products = response.Content.ReadAsAsync<List<Product>>().Result;
    ViewData.Model = products;
    return View();
}

POST操作の例:

private static readonly HttpClient httpClient = new HttpClient();

public string SendDataToApi(string url, HotelData data)
{
    string content = JsonConvert.SerializeObject(data);
    var httpContent = new StringContent(content, Encoding.UTF8);
    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    
    var responseTask = httpClient.PostAsync(url, httpContent);
    var statusCode = responseTask.Result.StatusCode;
    
    return statusCode != HttpStatusCode.OK 
        ? responseTask.Result.Content.ReadAsStringAsync().Result 
        : $"StatusCode: {statusCode}";
}

public class HotelData
{
    public string HotelCode { get; set; }
    public MessageDetail Message { get; set; }
}

public class MessageDetail
{
    public string MessageType { get; set; }
    public string MessageContent { get; set; }
}
  1. WCFの呼び出し方法

WCF(Windows Communication Foundation)は、マイクロソフトが開発したデータ通信をサポートするアプリケーションフレームワークです。.NET Remoting、Webサービス、Socketメカニズム、HTTP、FTP関連技術を統合しています。

WCFのアーキテクチャ:

  1. 契約(コントラクト)
  • データ契約:サービスのパラメータ
  • メッセージ契約:SOAPプロトコル固有のメッセージ部分
  • サービス契約:サービスのメソッド
  • ポリシーとバインディング:セキュリティやその他の条件の設定、伝送方法とエンコーディングの指定
  1. サービスの実行
  • 制限動作:処理されるメッセージ数の制御
  • エラー動作:内部エラー発生時の処理
  • メタデータ動作:メタデータの提供方法
  • インスタンス動作:実行可能なサービスインスタンスの数
  • トランザクション動作:トランザクションの処理
  • スケジュール動作:WCFがメッセージを処理する方法の制御
  1. メッセージ転送
  • トランスポートチャネル:ネットワークからのメッセージの読み書き(HTTP、名前付きパイプ、TCP、MSMQなど)
  • プロトコルチャネル:メッセージヘッダーの読み書きによるメッセージプロトコルの実装(WS-Security、WS-Reliabilityなど)
  1. ホスティングとアクティベーション
  • サービスホスト:WCFサービスのライフサイクルとコンテキストを管理し、開始と停止を担当

WCFとWebサービスの違い:

  1. Webサービス:業界標準であり、XMLを使用してデータを表現します。SOAPプロトコルを使用して分散環境でのデータ交換を実現します。WSDLを使用してサービスインターフェースを記述します。

  2. WCF:ASP.NET Webサービスの進化版であり、Webサービスの業界標準とコアプロトコルをサポートします。XML形式だけでなく、独自のフォーマッターも提供します。

WCFの基本的な概念:

  • 契約(コントラクト)
  • アドレス
  • エンドポイント
  • バインディング(Binding)
  • ホスティング

タグ: .NET SOAP REST HTTP XML

7月12日 19:40 投稿