質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.32%

  • C#

    7714questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Webサイト

    1131questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • REST

    148questions

    REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

  • Visual Studio 2010

    126questions

    Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

  • WCF

    14questions

    Windows Communication Foundation

WCFで組んだもののServiceをWebブラウザ上で動かす方法が知りたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,900

RI_KU

score 16

◆Visual Studio 2010
◆.netFrameWork3.5

現在WCFRestServiceを使用してウェブブラウザから引数付きURLを受け付け、その引数を利用してDBを更新、DB処理がうまくいったかどうかの戻り値を返す処理を組んでいます。

が、、、
WCFサービスにhttp://localhost:ポート番号/Service.svc
WCFサービスにhttp://localhost:ポート番号/Service.svc?wsdl

まではネットで調べた通り下記参考先に添付されている画面と同様なものにつなげることができます。
◆参考 一番下の画面の日本語Ver
**単純な WCF サービスの実装

http://aspnet.keicode.com/basic/wcf-simple-service.php

しかしここから中のサービスを呼ぶことができません。
やりたいことの例を記します。
【ウェブブラウザからの入力値】
http://localhost:ポート番号/Service.svc/StatusUpdater/26/yamada/hanako

【C#】
UriTemplate="StatusUpdater/{age}/{myoji}/{name}"的なイメージ

【DataBase】
yamada hanakoさんの年齢を26に更新

Httpステータスコードを返す(正常終了:200, 異常:500...etc)

果たしてWebブラウザから引数付きのURLを入力しただけでプログラムを走らせることは可能なのでしょうか。。。IDEで実行してないので、まずデバッグができないですよね。
下記を参考にXMLページが返ってくるものをコピペで作り、コード中にdebaug.writeline(...)等書きましたが案の定デバッグしてないのでコンソールに出力されるはずもなく。。。
ましてや引数付URLを入力しただけで裏で処理が走りDBに接続して更新処理を行うなんてできるのでしょうか。

10 行でズバリ!! リモートからの SharePoint 接続 – REST の使用 (C#)
https://code.msdn.microsoft.com/office/10-SharePoint-REST-C-d76023f9

完全に詰まっております。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2017/03/17 22:01

    https://teratail.com/questions/69180 の退会済みユーザーさんの関係者または同一人物なのでしょうか? 違ったら失礼しました。

    キャンセル

回答 1

check解決した方法

0

自己解決いたしました。
http://~/〇〇Service/引数/引数/引数
の形でURL渡してDBを更新し、HttpStatusCodeを返す処理を実装できました。

サービスのホスティングもConsoleApplicationからではなく、Webブラウザから行っています。
色々Googleで調べるとホスティングをConsoleApplicationから行っている人が多かったです。
ですが、WebAPIなのにConsoleApplicationでHostよんで処理させるってそもそもどうかと思うのですが。。。

肝心のウェブブラウザから接続する方法が全くなかったので、同じことで悩まれる方のためにもコード参考程度ですがのせます。

細かいロジックはこれから考えます。
回答は付きませんでしたが、これから同じことで悩む方のためにコードを載せておきます。

コード丸々載せてしまうと関係者に案件バレしてしまいそうなので、所々伏せているので
各自書き換えてください。

また、WCF Restのプロジェクトの作成方法は申し訳ありませんググってください。

またC#でStoredProcedureを実行し、戻り値を取得する処理も記述されているので参考程度に...

【環境】
Visual Studio 2010
SQLServer2014
HttpStatusCodeを使用するためにSystem.NET名前空間のusingが必要。

◆プロジェクト
【サービスインタフェース】

using System.ServiceModel;
using System.ServiceModel.Web;
using System.Net;
using System.Collections.Generic;

namespacenamespace】
{

    [ServiceContract]
    public interface IService(先頭のIはInterfaceのI)"
    {
        [OperationContract]
        [WebInvoke(
            Method = "GET",
            // BodyStyle = WebMessageBodyStyle.Wrapped, // 有:{"PjStrSttsUpdaterResult":HttpStatusCode} 無:HttpstatusCodeが表示される
            ResponseFormat = WebMessageFormat.Json,     // JsonをXmlに変えると、返却値がxml形式になる
            UriTemplate = "{hikisuOne}/{hikisuTwo}/{hikisuThree}")]
        HttpStatusCode ServiceMethod(string hikisuOne, string hikisuTwo, string hikisuThree);

    }
}

【サービス(Interfaceを実装している)】

using System;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Runtime.Serialization;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Net;
using System.Text;

namespacenamespace】
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class Service : IService
    {
        public HttpStatusCode ServiceMethod(string hikisuOne, string hikisuTwo, string hikisuThree)
        {
            #region 更新処理
            using (SqlConnection cnn = 【Connectionの取得処理】)
            {
                HttpStatusCode httpReturnCode = HttpStatusCode.Continue;
                string connectionString = string.Empty;
                connectionString = "接続文字列";
                cnn.ConnectionString = connectionString;
                cnn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.CommandText = "[sample].[プロシージャ]";
                cmd.Parameters.Clear();
                cmd.Parameters.Add("@hikisuOne", System.Data.SqlDbType.NVarChar).Value = hikisuOne;
                cmd.Parameters.Add("@hikisuTwo", System.Data.SqlDbType.NVarChar).Value = hikisuTwo;
                cmd.Parameters.Add("@hikisuThree", System.Data.SqlDbType.NVarChar).Value = hikisuThree;

                cmd.Parameters.Add("ReturnValue", System.Data.SqlDbType.Int);
                cmd.Parameters["ReturnValue"].Direction = System.Data.ParameterDirection.ReturnValue;
                // 実行
                cmd.ExecuteNonQuery();
                // 結果取得
                int returnValue = (int)cmd.Parameters["ReturnValue"].Value;
                // HttpStatusCode判定
                switch (returnValue)
                {   // 200
                    case 1:
                        httpReturnCode = HttpStatusCode.OK;
                        break;
                    // 400
                    case 2:
                        httpReturnCode = HttpStatusCode.BadRequest;
                        break;
                    // 500
                    default:
                        httpReturnCode = HttpStatusCode.InternalServerError;
                        break;
                }
                return httpReturnCode;
            #endregion
            }
        }
    }
}

◆Webサイト(サーバ)側
・ソリューション右クリック→追加→新しいWebサイト(W)で作成されるもの
【Global.asax】

<%@ Application Language="C#" %>

<script runat="server">

    void Application_Start(object sender, EventArgs e) 
    {
        // アプリケーションのスタートアップで実行するコードです
        System.Web.Routing.RouteTable.Routes.Add(
            new System.ServiceModel.Activation.ServiceRoute(
                "Service", new System.ServiceModel.Activation.WebServiceHostFactory(), typeof(【namespace】.Service)));
    }
    void Application_End(object sender, EventArgs e) 
    {
        //  アプリケーションのシャットダウンで実行するコードです

    }

    void Application_Error(object sender, EventArgs e) 
    { 
        // ハンドルされていないエラーが発生したときに実行するコードです

    }

    void Session_Start(object sender, EventArgs e) 
    {
        // 新規セッションを開始したときに実行するコードです

    }

    void Session_End(object sender, EventArgs e) 
    {
        // セッションが終了したときに実行するコードです 
        // メモ: Web.config ファイル内で sessionstate モードが InProc に設定されているときのみ、
        // Session_End イベントが発生します。session モードが StateServer か、または SQLServer に 
        // 設定されている場合、イベントは発生しません。

    }

</script>

【Service.svc】

<%@ ServiceHost Service="【namespace】.Service"%>

【web.config】

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
  </system.web>
  <!--<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
  </system.serviceModel>-->
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
      <service name="【namespace】.Service" behaviorConfiguration="NewBehavior">
        <endpoint address="" behaviorConfiguration="ServiceBehavior" binding="webHttpBinding" bindingConfiguration="" contract="【namespace】.IService"/>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="ServiceBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="NewBehavior">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings/>
  </system.serviceModel>
</configuration>

例:
http://localhost:Webサイトのポート番号/Webサイトの仮想パス/SVCファイル名.svc
でサービスが作成されたことを確認後、下記を入力
http://localhost:Webサイトのポート番号/Webサイトの仮想パス/Service*1/23/yamada/tarou
*1・・・Global.asaxでAddした文字列

Webサイトのポート番号, Webサイトの仮想パスはVS2010であれば、ソリューションエクスプローラ上でWebサイトをクリック又は右クリックをしてプロパティウィンドウから参照できます。

以上です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C#

    7714questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Webサイト

    1131questions

    一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

  • REST

    148questions

    REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

  • Visual Studio 2010

    126questions

    Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

  • WCF

    14questions

    Windows Communication Foundation