ラベル WCF の投稿を表示しています。 すべての投稿を表示
ラベル WCF の投稿を表示しています。 すべての投稿を表示

2015年8月7日金曜日

Web サービス参照時の認証プロキシ設定(2) config ファイル使わないパターン

前回のメモと同様に、悩ましくてしょうがない認証プロキシ相手で外部サービスを利用する際の方法です。今回は「諸般の事情」で config ファイルを利用しにくいケースに利用できる方法の一つになります。

2015年8月6日木曜日

Web サービス参照時の認証プロキシ設定

世の中で非常に嫌われている認証プロキシですが、残念ながらこちらの事情とは関係なく導入されているところは多々あると思います。

そのよう環境で外部サービスを参照するようなアプリを作成しようとした場合、プロキシ認証を通らないために泣きそうになることがあります。

2011年7月16日土曜日

CLR/H 第60回 勉強会にて利用するスライド

7/16 に行います CLR/H 第60回勉強会にて利用するスライドをアップしておきます。



ダウンロードはこちらから。

2011年6月15日水曜日

WCF の拡張機能

現時点で WCF 用の拡張機能が何個か用意されています。

WCF Web API はよくある Web サービスを構築するための追加機能で現在 Preview 4 となっています。今まででも REST 形式の Web サービスであれば対応できているのですが、Web API の利用により、より最近らしい Web サービスの構築ができるようになるとのこと。話自体は去年とかからみかけていたのですが全く試していません。
どうやら今までの WCF Web サービスよりも HTTP に関係した部分で、より細かい制御を行えるようになる、とのことですが・・・。

jQuery Support はその名前の通り、WCF Web サービスを jQuery から利用しやすい形で構築できるようにするものです。元々 WCF Web サービス自体、.Net なアプリからのアクセスを主軸に置いていた点が大きく、それ以外のアプリからアクセスできるようにするには、基本 REST 形式の対応が必要でした。jQuery は非常に著名で多くの場面で利用されているので、この対応はかなり嬉しい人も多いんじゃないかと思います。

Express Interop Bindings は上二つとちょっと毛色が異なり、特定のアプリと接続するための設定や実装をより容易にするためのものです。そしてこれは VisualStudio のアドインという形での提供ですので開発者向けとなっています。現時点で対応を示しているのは次のものとなっています。

  • Oracle WebLogic
  • Oracle Metro
  • IBM WebSphere
  • Apache Axis2

Wizard 形式で設定できるらしい記述がされています。試そうにも残念ながらここで対象となるシステムが手元にないので、こればかりはどうしようかなぁ。

なお、試してみるのあたり一つ注意点が。

jQuery Support を利用するには WCF RIA Services の新バージョンが必要となります。恐らくほとんどの人は WCF RIA Servies V1 (SP1) がインストールされているかと思いますが、必要となるのは WCF RIA Services V1 SP2 となっています。そしてこれは Preview(April 2011) 版でのみ提供されていますので、この点だけ注意してください。

2011年5月13日金曜日

REST っぽい Workflow サービスの公開

実際には Workflow サービスにおいて REST 形式での公開は行えません。というのも、MSDN に記載されている通り、メッセージング関係のアクティビティでは定型的な推測のみ行うように用意されており、WebGet 属性や WebInvoke 属性等を付与する事ができないためです。
ですが WCF の機能を利用する事により「それっぽい」形に仕上げる事はできます。
Arguments

2011年5月9日月曜日

Workflow 上の Receive アクティビティと WCF での実装

Workflow 上で Receive アクティビティ等を利用し送受信を行うサービスを構築できるのは以前の記事などで書いた通りです。それをWCFでロジックを組んだ場合にどうなるか、というのを比較してみると各プロパティでの設定がなんとなくでも見えてくるかと思います。

1: <ServiceContract()>
2: Public Interface IService1
3: 
4:     <OperationContract()>
5:     Function GetData(ByVal value As Integer) As String
6: 
7: End Interface

このソースが Receive アクティビティを利用した場合をWCFにて表したソースとなります。アクティビティ上で OperationName プロパティで指定した名称はそのまま Function 名となり、WorkflowService の Name プロパティで指定したものがインターフェース名(≒クラス名)となります。Receive アクティビティの Content で指定したものは、Function の引数として定義、または DataContract 属性を付与したクラスとなります。

このような事を自動で行っているために、WCF ではできている事が Workflow 上ではできていない点もあります。一つが Function に対しての属性付加 ( WebGet とか ) で、これができないので REST サービスとしての Workflow が行えていません。

ただ上記のようなロジックを組み、コード上で Workflow を利用する形式であればRESTであろうと行えるので、やりようはあるのですが Workflow 単体では残念ながらまだ手段がわかっていません。

2010年9月7日火曜日

WCF 名前付きパイプでの通信

非常に今さらながら感があるけれど、ようやく最近まっとうにさわり始めたのでメモ。
サービス部の定義としてインターフェースを作成。これはなんであろうと一緒。
Imports System.ServiceModel
<ServiceContract()> _
Public Interface ISampleService
    <OperationContract()> _
    Function GetStatus() As Boolean End Interface
サービスに対しての実体を実装。これもなんであろうと一緒。
Imports System.ServiceModel
Public Class SampleService
    Implements ISampleService
    Public Function GetStatus() As Boolean Implements ISampleService.GetStatus
        Console.WriteLine("Is Called Method [GetStatus]")
        Return True
    End Function
End Class
IISでホストしてもいいんだけど今回はセルフホストさせた。
Private Const PipeNamespace As String = "http://schemas.sample.jp/SampleServices"
Private Const NamedPipeAddress As String = "net.pipe://localhost/SampleService.svc"
Sub Main()
    Dim localServiceAddress As Uri() = {New Uri(NamedPipeAddress)}
    Dim svType As Type = GetType(TaskNotifyService)
    Using taskNotifySv As New ServiceHost(svType, localServiceAddress)
        Dim namedPipe As Binding = New NetNamedPipeBinding(NetNamedPipeSecurityMode.None)
        namedPipe.Namespace = PipeNamespace
        Dim taskNotifyMetadata As New ServiceMetadataBehavior
        taskNotifySv.AddServiceEndpoint(GetType(ITaskNotifyService), namedPipe, String.Empty)
        taskNotifySv.Description.Behaviors.Add(taskNotifyMetadata)
        taskNotifySv.Open()
        Console.ReadLine()
        taskNotifySv.Close()
    End Using End Sub
これで net.pipe://localhost/SampleService.svc というアドレスにて名前付きパイプで通信が可能になるので、あとはクライアント側の実装。
Sub Main()
    Dim namedPipe As Binding = New NetNamedPipeBinding(NetNamedPipeSecurityMode.None)
    Dim localAddress As New EndpointAddress("net.pipe://localhost/SampleService.svc")
    Using cf As New ChannelFactory(Of SampleLibrary.ISampleService)(namedPipe, localAddress)
        cf.Open()
        Dim cProxy As SampleLibrary.ISampleService = cf.CreateChannel
        Console.WriteLine("Called Method : " + cProxy.GetStatus.ToString)
        Console.ReadLine()
        cf.Close()
    End Using End Sub
サービスとインターフェースを実装しているライブラリを参照する必要があるけど、これぐらい手軽にできるのは WCF って便利だねぇ。

2010年8月6日金曜日

Syetem.ServiceModel 3.0.0.0 が何故か呼び出されてしまう件

講習で教えているのもあり、WCF 4 で作成したサービスを IIS 7.5 にてホスティングしようとしていて四苦八苦したのでメモ。

開発用Webサーバではしっかり動作するのに、IIS に変えてみると

「System.ServiceModel.Activation.HttpHandler 3.0.0.0」

が読み込みに失敗している旨のエラーが出てしまう場合。エラー内容から、どこかの設定にて上記アセンブリを参照しようとしているのは何となくわかるんだけど、それがどこにあるかがわからなかったわけで。

IIS の設定としてハンドラーマッピングとモジュールがあり、そこを変更してもうまくいかないんだよねぇ(まぁ元々方法としてどうよ?だけど)

で検索して色々調べていると、ご飯党(@shusoku)さんという方がそのものズバリな事をつぶやいていました。

sc0000

これに従う形として、サービスプロジェクト側の web.config に手作業で <modules>セクションと <handlers> セクションを <system.webserver> セクションに追加。こんな感じ

<modules>
    <remove name="ServiceModel"/>
    <add name="ServiceModel" type="System.ServiceModel.Activation.ServiceHttpModule, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</modules>
<handlers>
    <remove name="svc-Integrated" />
    <add name="svc-Integrated" path="*.svc" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModell.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" resourceType="Unspecified" requireAccess="None" preCondition="integratedMode" />
</handlers>

どうやら IIS 7.5 をインストした際の初期設定では .NET 4 用の設定があるんだけどうまいこと利用されない、ということらしい。

とりあえずこれでサービスが無事動作するところはOKでした。