自己署名入り証明書の場合は、以下のプログラムで。
[引用]
http://www.atmarkit.co.jp/fdotnet/dotnettips/867sslavoidverify/sslavoidverify.html
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Security;
using System.Windows.Forms;
using System.Security.Cryptography.X509Certificates;
namespace WCFTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(OnRemoteCertificateValidationCallback);
}
private void button1_Click(object sender, EventArgs e)
{
var client = new ServiceReference1.Service1Client();
var s = client.GetData(10);
MessageBox.Show(s);
client.Close();
}
private bool OnRemoteCertificateValidationCallback(
Object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
return true; // 「SSL証明書の使用は問題なし」と示す
}
}
}
2017年7月8日土曜日
WCFでhttps通信[App.config]
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpsBinding>
<binding name="SecureBinding" />
</basicHttpsBinding>
</bindings>
<client>
<endpoint address="https://[servername]/Test/Service1.svc" binding="basicHttpsBinding"
bindingConfiguration="SecureBinding" contract="ServiceReference1.IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpsBinding>
<binding name="SecureBinding" />
</basicHttpsBinding>
</bindings>
<client>
<endpoint address="https://[servername]/Test/Service1.svc" binding="basicHttpsBinding"
bindingConfiguration="SecureBinding" contract="ServiceReference1.IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
WCFでhttps通信[web.config]
■VisualStudio2013だとprotocolMappingが設定されなかったので自分で追加しないといけなかった。
■VisualStudio2017ではprotocolMappingは自動で追加された。
protocolMappingでhttpsがないと、エンドポイントがアクティブ化できないとエラーになる。
この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.6.2" />
<httpRuntime targetFramework="4.6.2"/>
</system.web>
<system.serviceModel>
<services>
<service name="WcfService1.Service1">
<endpoint address="Service1.svc" binding="basicHttpsBinding" bindingConfiguration="SecureBinding"
contract="WcfService1.IService1" />
<host>
<baseAddresses>
<add baseAddress="https://[servername]/test" />
</baseAddresses>
</host>
</service>
</services>
<bindings>
<basicHttpsBinding>
<binding name="SecureBinding" />
</basicHttpsBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- メタデータ情報の開示を避けるには、展開する前に下の値を false に設定します -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- デバッグ目的で障害発生時の例外の詳細を受け取るには、下の値を true に設定します。例外情報の開示を避けるには、展開する前に false に設定します -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add scheme="https" binding="basicHttpsBinding" bindingConfiguration="SecureBinding" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
デバッグ中に Web アプリケーションのルートを直接参照するには、下の値を true に設定します。
Web アプリケーション フォルダーの情報開示を避けるには、展開する前に false に設定します。
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
■VisualStudio2017ではprotocolMappingは自動で追加された。
protocolMappingでhttpsがないと、エンドポイントがアクティブ化できないとエラーになる。
この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.6.2" />
<httpRuntime targetFramework="4.6.2"/>
</system.web>
<system.serviceModel>
<services>
<service name="WcfService1.Service1">
<endpoint address="Service1.svc" binding="basicHttpsBinding" bindingConfiguration="SecureBinding"
contract="WcfService1.IService1" />
<host>
<baseAddresses>
<add baseAddress="https://[servername]/test" />
</baseAddresses>
</host>
</service>
</services>
<bindings>
<basicHttpsBinding>
<binding name="SecureBinding" />
</basicHttpsBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- メタデータ情報の開示を避けるには、展開する前に下の値を false に設定します -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- デバッグ目的で障害発生時の例外の詳細を受け取るには、下の値を true に設定します。例外情報の開示を避けるには、展開する前に false に設定します -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add scheme="https" binding="basicHttpsBinding" bindingConfiguration="SecureBinding" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
デバッグ中に Web アプリケーションのルートを直接参照するには、下の値を true に設定します。
Web アプリケーション フォルダーの情報開示を避けるには、展開する前に false に設定します。
-->
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
2017年6月5日月曜日
Raspberry Pi3で遊ぶ 初期設定編
<基本設定:ローカライゼーション>
・左上のMenu、Preferences、RaspberryPi Configurationをクリック
・ウィンドウのLocalisationタブ
・Set Timezoneをクリックし、AreaをAsia、LocationをTokyoにする
・キーボードの設定、Set Keyboardを押し、CountryをJapan、VariantをJapanese(OADG 109A)にする
<基本設定:日本語化>
・Menuにあるコマンドプロンプト風のアイコン、LXTerminalを起動
・「sudo apt-get update」と入力、Enter
・終わったら「sudo apt-get install fonts-vlgothic」と入力、Enter
なんか聞いてきたら「y」を押せばいい
全部終わったら×で閉じるかExit
・さっきのLocalisationタブを開いて、Set Localeを押す
・Languageにja(japanese)
・Countryにjp(japan)
・Character SetにUTF-8
再起動後に日本語になる
<画面解像度の設定>
LXTerminalで「sudo raspi-config」と入力Enter
7 Advanced Option>A5 Resolution>好きな解像度を選んで、了解すると再起動後に
解像度が変わる。
<日本語入力>
LXTerminalで「sudo apt-get install ibus-anthy」と入力Enter
適当に「y」で進む
終わったら、Menu>設定>iBusの設定をクリック
iBusデーモンが起動していません。起動しますか?を「はい」
再起動すると日本語が入力できると思う。
「半角/全角」キーで変換切り替えできるみたい。
できなかったらiBusの設定でEnglishを消すといいかもしれない。
今は消してやってる。
ここまで来たらブラウザ、オフィスなど使い放題
・左上のMenu、Preferences、RaspberryPi Configurationをクリック
・ウィンドウのLocalisationタブ
・Set Timezoneをクリックし、AreaをAsia、LocationをTokyoにする
・キーボードの設定、Set Keyboardを押し、CountryをJapan、VariantをJapanese(OADG 109A)にする
<基本設定:日本語化>
・Menuにあるコマンドプロンプト風のアイコン、LXTerminalを起動
・「sudo apt-get update」と入力、Enter
・終わったら「sudo apt-get install fonts-vlgothic」と入力、Enter
なんか聞いてきたら「y」を押せばいい
全部終わったら×で閉じるかExit
・さっきのLocalisationタブを開いて、Set Localeを押す
・Languageにja(japanese)
・Countryにjp(japan)
・Character SetにUTF-8
再起動後に日本語になる
<画面解像度の設定>
LXTerminalで「sudo raspi-config」と入力Enter
7 Advanced Option>A5 Resolution>好きな解像度を選んで、了解すると再起動後に
解像度が変わる。
<日本語入力>
LXTerminalで「sudo apt-get install ibus-anthy」と入力Enter
適当に「y」で進む
終わったら、Menu>設定>iBusの設定をクリック
iBusデーモンが起動していません。起動しますか?を「はい」
再起動すると日本語が入力できると思う。
「半角/全角」キーで変換切り替えできるみたい。
できなかったらiBusの設定でEnglishを消すといいかもしれない。
今は消してやってる。
ここまで来たらブラウザ、オフィスなど使い放題
Raspberry Pi3で遊ぶ インストール編
・RaspberryPi3を買う(6000円)
・電源用USBアダプタ(2000円)とケース(800円)
MicorSDカード(32GB Class10ぐらいが良さげ6000円)
も一緒に買うと便利
・Noobsをダウンロードして、Zipを展開しSDカードにコピー
・展開したファイル群がトップレベルにくるようにコピーする
(NOOBS_v2_4_0の中身が一番上)
・電源とHDMI、キーボード、マウス、LANをラズパイに挿す
・OSのインストールが始まるのでRaspbianを選択して続行
・20分ぐらいするとOSのインストール終了
・デスクトップが起動する
・電源用USBアダプタ(2000円)とケース(800円)
MicorSDカード(32GB Class10ぐらいが良さげ6000円)
も一緒に買うと便利
・Noobsをダウンロードして、Zipを展開しSDカードにコピー
・展開したファイル群がトップレベルにくるようにコピーする
(NOOBS_v2_4_0の中身が一番上)
・電源とHDMI、キーボード、マウス、LANをラズパイに挿す
・OSのインストールが始まるのでRaspbianを選択して続行
・20分ぐらいするとOSのインストール終了
・デスクトップが起動する
2016年8月9日火曜日
Visual Studio 2013でVsPackageを作る
2013ではaddin機能が無くなり、VsPackageになった。
VsPackageのSDKをダウンロードし
新規プロジェクトをVsPackageで作成する。
プログラムを記述してビルドし
binのフォルダーに作成される.vsixファイルを
ダブルクリックすることでインストールできる。
2016年5月23日月曜日
catchしたExceptionの再スロー
C#でtry~catchを行うとき、catchブロックでthrowのみ書いてるソースがあったので
意味あんのか?ってことで調べてみた。
自分の認識では関数内のExceptionは最終的に.Net Frameworkが受けてくれるので
単にthrowするだけなら意味がないように思う。
ということで、スタックトレースがどう違うかを比べてみた。
①Hoge1~3はtry~catchを行わず、呼び出し元でtry~catchしてみる。
②Foo1~3はtry~catchを行ない、catch句ではthrow;のみする
①結果
********Hoge*********
System.DivideByZeroException: 0 で除算しようとしました。
場所 WindowsFormsApplication1.Form1.Hoge3() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 53
場所 WindowsFormsApplication1.Form1.Hoge2() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 48
場所 WindowsFormsApplication1.Form1.Hoge1() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 43
場所 WindowsFormsApplication1.Form1.Hoge() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 37
場所 WindowsFormsApplication1.Form1.button1_Click(Object sender, EventArgs e) 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 25
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
②結果
********Foo*********
System.DivideByZeroException: 0 で除算しようとしました。
場所 WindowsFormsApplication1.Form1.Foo3() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 110
場所 WindowsFormsApplication1.Form1.Foo2() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 104
場所 WindowsFormsApplication1.Form1.Foo1() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 92
場所 WindowsFormsApplication1.Form1.Foo() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 80
場所 WindowsFormsApplication1.Form1.button2_Click(Object sender, EventArgs e) 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 62
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
③結果
********Func*********
System.DivideByZeroException: 0 で除算しようとしました。
場所 WindowsFormsApplication1.Form1.Func() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 137
場所 WindowsFormsApplication1.Form1.button3_Click(Object sender, EventArgs e) 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 119
■結論
ということで、 catch句で何かしらの処理を行うならアリだが、単にthrow;だけなら不要。
③のパターンはスタックトレースが最後のthrow分しか残ってないので最悪。
普通に①でやるのがよさげ。
意味あんのか?ってことで調べてみた。
自分の認識では関数内のExceptionは最終的に.Net Frameworkが受けてくれるので
単にthrowするだけなら意味がないように思う。
ということで、スタックトレースがどう違うかを比べてみた。
①Hoge1~3はtry~catchを行わず、呼び出し元でtry~catchしてみる。
#region Hoge
private void button1_Click(object sender, EventArgs e)
{
try
{
Hoge();
}
catch (Exception ex)
{
Console.WriteLine();
Console.WriteLine("********Hoge*********");
Console.WriteLine(ex.ToString());
}
}
private void Hoge()
{
Hoge1();
}
private void Hoge1()
{
Hoge2();
}
private void Hoge2()
{
Hoge3();
}
private void Hoge3()
{
throw new DivideByZeroException();
}
#endregion
②Foo1~3はtry~catchを行ない、catch句ではthrow;のみする
#region Foo③Func1~3はtry~catchを行ない、catch句ではthrowされたExceptionをさらにthrowする
private void button2_Click(object sender, EventArgs e)
{
try
{
Foo();
}
catch (Exception ex)
{
Console.WriteLine();
Console.WriteLine("********Foo*********");
Console.WriteLine(ex.ToString());
}
}
private void Foo()
{
try
{
Foo1();
}
catch
{
throw;
}
}
private void Foo1()
{
try
{
Foo2();
}
catch
{
throw;
}
}
private void Foo2()
{
try
{
Foo3();
}
catch
{
throw;
}
}
private void Foo3()
{
throw new DivideByZeroException();
}
#endregion
#region Func
private void button3_Click(object sender, EventArgs e)
{
try
{
Func();
}
catch (Exception ex)
{
Console.WriteLine();
Console.WriteLine("********Func*********");
Console.WriteLine(ex.ToString());
}
}
private void Func()
{
try
{
Func1();
}
catch (DivideByZeroException ex)
{
throw ex;
}
}
private void Func1()
{
try
{
Func2();
}
catch (DivideByZeroException ex)
{
throw ex;
}
}
private void Func2()
{
try
{
Func3();
}
catch(DivideByZeroException ex)
{
throw ex;
}
}
private void Func3()
{
throw new DivideByZeroException();
}
#endregion
①結果
********Hoge*********
System.DivideByZeroException: 0 で除算しようとしました。
場所 WindowsFormsApplication1.Form1.Hoge3() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 53
場所 WindowsFormsApplication1.Form1.Hoge2() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 48
場所 WindowsFormsApplication1.Form1.Hoge1() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 43
場所 WindowsFormsApplication1.Form1.Hoge() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 37
場所 WindowsFormsApplication1.Form1.button1_Click(Object sender, EventArgs e) 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 25
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
②結果
********Foo*********
System.DivideByZeroException: 0 で除算しようとしました。
場所 WindowsFormsApplication1.Form1.Foo3() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 110
場所 WindowsFormsApplication1.Form1.Foo2() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 104
場所 WindowsFormsApplication1.Form1.Foo1() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 92
場所 WindowsFormsApplication1.Form1.Foo() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 80
場所 WindowsFormsApplication1.Form1.button2_Click(Object sender, EventArgs e) 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 62
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
例外がスローされました: 'System.DivideByZeroException' (WindowsFormsApplication1.exe の中)
③結果
********Func*********
System.DivideByZeroException: 0 で除算しようとしました。
場所 WindowsFormsApplication1.Form1.Func() 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 137
場所 WindowsFormsApplication1.Form1.button3_Click(Object sender, EventArgs e) 場所 D:\94_DevelopVS\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs:行 119
■結論
ということで、 catch句で何かしらの処理を行うならアリだが、単にthrow;だけなら不要。
③のパターンはスタックトレースが最後のthrow分しか残ってないので最悪。
普通に①でやるのがよさげ。
登録:
投稿 (Atom)