crossframe » ASP.NET http://crossframe.iiv.jp Windows Dev. Site Tue, 07 Nov 2023 06:31:52 +0000 ja hourly 1 https://wordpress.org/?v=3.8.41 WCF Service Application ../../../20150207968/ ../../../20150207968/#comments Sat, 07 Feb 2015 12:47:13 +0000 ../../../?p=968 ASP.NETでOData、データソースにAccessファイルとか、いろいろとやりたいことがあるのですが、環境がすぐに用意できなかったり、うまくいかなかったりしたため、とりあえず基本となるWCFの部分だけ、メモっておこうと思います。
といっても、デフォルトである程度動くと見込んだものの、ちょっと戸惑いました。

環境 : Visual Studio 2013 / Windows 8.1

wcf06
WCFサービスアプリケーションで新規プロジェクトを作り、何も変更せずに実行しました。
WCFテストクライアントが立ち上がり、リクエスト、レスポンスのテストができます。
wcf01

ブラウザから、GETリクエストでレスポンスを得るために、以下のようにGetData2メソッドを追加しました。
(この追加をすると、上記のWCFテストクライアントでのテストはできなくなりました。自動でたちあがらくなり、コマンドwcftestclient.exe直接実行でもエラーがでます)

wcf07

Service1.csv.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WcfService01
{
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }
        [WebGet(UriTemplate = "data/{value}")]
        public string GetData2(String value)
        {
            return string.Format("You entered: {0}", value);
        }
        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }
    }
}

IService1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WcfService01
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData(int value);
        [OperationContract]
        string GetData2(String value);
        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);
    }
    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";
        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }
        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }
}

まず以下のようにデフォルトの画面を確認して、
wcf05
パラメータを追加してみます。
wcf04
と表示するはずですが、以下のように設定を追加していないとBad Request となり白い画面になってしまいます。
Web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>

    <!--追加 -->
    <services>
      <service name="WcfService01.Service1">
        <endpoint address=""
                  behaviorConfiguration="restBehavior"
                  binding="webHttpBinding"
                  contract="WcfService01.IService1" />
      </service>
    </services>
    
    <behaviors>
      <!-- 追加 -->
      <endpointBehaviors>
        <behavior name="restBehavior">
          <webHttp helpEnabled="true"/>
        </behavior>
      </endpointBehaviors>
      
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

これにより、XML POSTリクエストも可能になります。
環境 : Cygwin / Windows 8.1
wcf08
最初、レスポンスが得られないとき、URLが違うのか、このやり方が違うのか迷いました。
結局、うまくいっているサンプルを探し、そのWeb.configファイルと比較したら、上のような違いをみつけました。
(Microsoftのプロダクトは、権限とか設定とかデフォルトで無効になっているものがよくあるように思います。
セキュリティを高めるためだとは思いますが、ちょっと動かしてみたいというときにできないと、次に進めなくてあきらめてしまいがちです。)
できたところまで、とりあえずメモでした。

]]>
../../../20150207968/feed/ 0
SignalR / WindowsAzure ../../../20130715373/ ../../../20130715373/#comments Mon, 15 Jul 2013 14:08:30 +0000 http://xfra.me/?p=373 前々回の投稿「ASP.NET SignalR」で、SignalRのテストをIISでしましたが、これをAzureにデプロイしてみたのを備忘録として書きました。

1) manage.windowsazure.comのサイトで、WEBサイトを新規追加
2) ダッシュボードの概要から、発行プロファイルのダウンロード
azureWeb
3) VisualStudo2012のプロジェクト右クリックで、「発行」を選択
4) 2)でダウンロードしたプロファイルをインポート
azureDeploy
インポートをすると自動的に上のような画面になります。
5) 「発行」ボタン押下でブラウザが起動 URL http://****.azurewebsites.net
6) URLをhttp://****.azurewebsites.net/WebFrom1.aspx

これで動作確認できました。

ソースは以下の部分修正しました。

//var connection = $.hubConnection("http://192.168.11.10/test/aspEmptyWebSignalr/signalr/hubs");
var connection = $.hubConnection();

(こういうのメモしておかないと、バージョンアップ等でインターフェイスとか変わったりすると結構つまらないところで悩んだりするんですよね。)

ブラウザは、IE10とFireFoxで試しましたが、WebSocketの通信ではなく、JSONのようでした。AzureのサーバがWebSocket対応でないためでしょうか。

]]>
../../../20130715373/feed/ 0
ASP.NET SignalR ../../../20130706335/ ../../../20130706335/#comments Sat, 06 Jul 2013 04:19:37 +0000 http://xfra.me/?p=335 サーバプッシュのWebテクノロジーはいくつかありますが、ASP.NETで提供される最新の技術であるSignalRを試してみました。
最近いろいろとテストするにあたって感じるのは、記事等を読んで理屈ではわかっていても実際にやってみると環境や設定、バージョン違い等で構築に結構手間取ったりすることがあります。やはり実際に自分でやってみるということは大切だと思うこのごろです。

今回参考にしたのは以下の記事ですが、パケットキャプチャをとるためIIS(ローカル)で動作させました。
http://www.atmarkit.co.jp/ait/articles/1303/19/news099.html ASP.NET SignalR入門(前編)

環境 : VisualStduo 2012 / Windows 8

管理者としてVSを実行
ASP.NET空のWebアプリケーションのプロジェクトを作成
参照設定の追加でNugetパッケージ管理からSignalRを検索してインストール
新しい項目の追加でSignalR Hubクラスを作成 MyHub1.cs
新しい項目の追加でグローバルアプリケーションクラス作成 Global.asax
新しいウェブフォームの追加 WebForm1.aspx, WebForm2.aspx

MyHub1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace aspEmptyWebSignalr.Hubs
{
    [HubName("echo")]
    public class MyHub1 : Hub
    {
        public void Send(string text)
        {
            Clients.All.Receive(text);
        }
    }
}

Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;
using System.Web.Routing;

namespace aspEmptyWebSignalr
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            RouteTable.Routes.MapHubs();
        }
    }
}

WebForm1.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="aspEmptyWebSignalr.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
  <script src="Scripts/jquery-1.6.4.min.js"></script>
  <script src="Scripts/jquery.signalR-1.1.2.min.js"></script>
  <script>
      $(function () {
          var connection = $.hubConnection("http://192.168.11.10/test/aspEmptyWebSignalr/signalr/hubs");
          var echo = connection.createHubProxy("echo");
          echo.on("Receive", function (text) {
              $("#list").append("<li>" + text + "</li>");
          });
          $("#send").click(function () {
              var message = $("#message").val();
              echo.invoke("Send", message).done(function () {
                  $("#message").val("");
              });
          });
          connection.start(function () {
              $("#send").prop("disabled", false);
          });
      })
  </script>
</head>
<body>
  <form id="form1" runat="server">
  <div>
    <input type="text" id="message" />
    <input type="button" id="send" value="送信" disabled="disabled" />
    <ul id="list"></ul>
  </div>
  </form>
</body>
</html>

受信のみバージョンもテストしてみました。(送信と受信をわけることによって面白いことができそうです。)
WebForm2.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="aspEmptyWebSignalr.WebForm2" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
  <script src="Scripts/jquery-1.6.4.min.js"></script>
  <script src="Scripts/jquery.signalR-1.1.2.min.js"></script>
  <script>
      $(function () {
          var connection = $.hubConnection("http://192.168.11.10/test/aspEmptyWebSignalr/signalr/hubs");
          var echo = connection.createHubProxy("echo");
          echo.on("Receive", function (text) {
              $("#list").append("<li>" + text + "</li>");
          });
          connection.start();
      })
  </script>
</head>
<body>
  <div>
    <ul id="list"></ul>
  </div>
</body>
</html>

IISにデプロイするときは$.hubConnectionの引数にURLをフルで書く必要があります。(デフォルトだと空)
デプロイは、IISマネージャでDefaultWebSiteの下にディレクトリを作成した後、VSのビルド->Webの発行で、発行方法「ファイルシストム」を選び、ターゲットに作成してディレクトリを指定します。
バケットキャプチャはWireSharkを使い、サーバ側(192.168.11.10)でキャプチャしました。クライアント(192.168.11.12)はFirefoxの最新バージョン(22)です。
captSignalR
送信したテスキトは、”aaaaaaaaaaaa”です。HTTPとはまた違うみたいですね。また調べていきたいです。ちなみにIE7/WindowsXPでも試しましたが、通信できませんでした。(WebSocketに対応していないブラウザだと違うプロトコルでやるのかなと思ったのですが・・まだ他に設定がいるのかも)あとiPhoneのSafariは動作確認しました。

ASP.NETの既存のサービスに追加する形で使うのに、とても便利だと思いました。

]]>
../../../20130706335/feed/ 0
.NET Webフレームワーク Nancy をC#とF#で ../../../20130621304/ ../../../20130621304/#comments Thu, 20 Jun 2013 15:04:51 +0000 http://xfra.me/?p=304 .NET 用の軽量Webフレームワーク Nancy をC#とF#でテストしてみました。

以下記事参照
http://shiba-yan.hatenablog.jp/entry/20130509/1368107112「Sinatra ライクな .NET 用軽量 Web フレームワーク「Nancy」を使ってみた 」

SinatraはJRuby/GoogleAppEngineで遊んだことがありますが、とてもシンプルで気にいっていました。.NETフレームワークにもこのようなものが欲しいと思っていたので、この記事をみつけてすぐにいろいろと試そうと思ったのですが、F#でASP.NETを使って何かをつくろうとしていたので、後回しにしていました。しかしASP.NETとF#って、VS2012の環境でまだ環境が十分でないためか、なかなか思った形のものができませんでした。(セルフホストのものはいろいろあるのですが・・)
そのときタイミングよくNancyでF#を使える以下の記事も見つけたので、C#とF#両方あわせて動くものを作ってみました。

http://qiita.com/yohfee/items/1e5908cd720706805c94「F#でNancyをASP.NETでホストする 」

環境 : VisualStudio 2012 / Windows 8
プロジェクト : C# ASP.NET 空のWebアプリケーション に 追加Webフォーム
追加プロジェクト : F#ライブラリ
Library1.fs

namespace Library1
open Nancy
type FsTest() =
    inherit NancyModule()
    do
        base.Get.["/fs"] <- fun _ -> box "Hello Nancy F#"

Nugetで、Nancy追加

WebForm1.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace csAspEmptyWebFsNancy
{
    public class CsTest : Nancy.NancyModule
    {
        public CsTest()
        {
            Get["/cs"] = _ => "Hello Nancy C#";
        }
    }
}

NuGetでNancy,Nancy.Hosting.Aspnet追加

ブラウザで、/cs, /fs とアクセスするとそれぞれの文字列が表示されます。
F#でパラメータを渡すことを試したのですが、いろいろと難しくまたトライしてみたいと思います。(C#は記事にあります)
結構いろいろとテストしたのですが、結局これだけしか公開できないとは・・
まだまだです。

]]>
../../../20130621304/feed/ 0
Node.js / WebMatrix を Azureで公開 ../../../2013022189/ ../../../2013022189/#comments Wed, 20 Feb 2013 15:13:26 +0000 http://xfra.me/?p=89 var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, { 'Content-Type': 'text/html' }); res.end('Hello, world! Sample'); }).listen(process.env.PORT || 8080);

VisualStudioでなく、簡単にWebアプリケーションを開発、AzureにデプロイできるWebMatrixというツールがあるということを知りました。
上のようなNode.jsのソース(テンプレートのまま)をローカルで動作確認をして、すぐにAzureに公開ができます。
下のように「実行」(ローカル)「発行」(Azure)のボタンを押すだけ。(Azure以外も可能)

webmx4

Azure側は、管理画面から、Webサイトを作成します。
ここで発行プロファイルをダウンロードして、

webmx1

この発行プロファイルを、WebMatrix側で読み込みます。
これで、WebMatirxとAzureが紐付られます。

webmx2

あとは手順に従いデプロイします。

webmx3

Azureで設定したURLが表示されるので、これをクリックして表示確認できます。

とても簡単にできますし、他にも紹介されているサイトがたくさんありますが、Azureまわりに限らず、最近のMicrosoftの製品・サービスはバージョンアップによってよくインターフェイスや操作性が変わったりするので、この時点でできた記録をとっておく意味でも記事にしました。(実際にやってみると記憶にも残りますし、たぶんすぐ参考にならなくなるかもしれませんが、変更があったときにどこを基準に考えるか、ということが結構大切なときがあると思う今日このごろ・・)
それだけホットということですね。

次の課題は、Azureのストレージです。クラウドならではのストレージに興味があります。

]]>
../../../2013022189/feed/ 0
Facebook OAuth / ASP.NET ../../../2013021062/ ../../../2013021062/#comments Sun, 10 Feb 2013 07:20:10 +0000 http://xfra.me/?p=62 Facebookを使った認証をこれまでPHPで実装したことがありましたが、ASP.NET MVC4 Webアプリケーションのテンプレートを使うと、恐ろしいほど簡単にできてしまったので、そのメモです。

環境 : VisualStudio2012 / Windows 8

テンプレートをビルドすると、App_Start->AuthConfig.csの中には、以下のように、Twitter,Microsoftアカウントのものも用意されます。
今回FacebookのAppIDと、AppSecretを有効にしてコンパイルするだけです。

public static class AuthConfig
{
    public static void RegisterAuth()
    {
        //OAuthWebSecurity.RegisterMicrosoftClient(
        //    clientId: "",
        //    clientSecret: "");

        //OAuthWebSecurity.RegisterTwitterClient(
        //    consumerKey: "",
        //    consumerSecret: "");

        OAuthWebSecurity.RegisterFacebookClient(
            appId: "******************",
            appSecret: "*********");

        //OAuthWebSecurity.RegisterGoogleClient();
    }
}

これでデフォルト画面のログインボタンを押すと、Facebookのボタンがでてきます。

screenlogin

Facebookアプリ開発が初めての方は、開発者登録をしておく必要があります。

https://developers.facebook.com/apps

新規アプリの追加画面で、以下のように「Facebookでログインするウェブサイト」にURLを入れ保存します。

fb1

保存すると、「Changes saved.なお、変更が反映されるまでにseveral minutesかかる場合があります。」とルー語が表示されますので、これで完了です。
このURLは、開発マシンのlocalhostでもOKです。

]]>
../../../2013021062/feed/ 0