| Frank 的个人资料Frank de Groot日志列表 | 帮助 |
|
|
1月29日 Using F#'s async workflows to invoke a WCF serviceIn addition to Ted Neward's posts on creating a WCF service in F# I'd like to share a howto on calling a WCF service asynchronously from F# using the infamous async workflows.
I'll start off with a simple data contract. This is not required, you could use only primitive type parameters, but I like data contracts. The easiest way is to create a record type. Unfortunately the serializer requires mutable fields, but I can live with that. Please note I'm skipping the open System.Runtime.Serialization and open System.ServiceModel.
[<DataContract>] [<DataMember>] mutable MyParameter:string; } [<DataContract>] [<DataMember>] mutable MyResultParameter:string; } Then I'll define an interface for my service in F#:
[<ServiceContract>] Now to invoke a service asynchronously I need to create a new interface with a slightly different signature. For WCF this new interface is equivalent to the one above, except that it allows asynchronous invocation. Because they need to have the same name I put them in a different assembly so I have one assembly for the contract at the server side and another assembly for the client side. We can reuse the data contract though.
[<ServiceContract>] Notice the Begin... and End... methods. By adding the AsyncPattern = true to the OperationContract WCF assumes that it's the asynchronous version of MyOperation. As you can see the signature is slightly different: BeginMyOperation expects an additional callback delegate and an optional state object and returns a 'handle' that is passed to EndMyOperation to get the result of invoking MyOperation. Note that here too I need to supply a name for the first parameter, in this case 'Request'. As Ted described WCF requires a name for the parameters specified in the interface definition. This is common in C# and VB so that's probably the reason why it wasn't noticed by the WCF team. Luckily it's easy to add in F#. The above code is enough to invoke a service asynchronously. But if we want to use it in async workflows we require another method named AsyncMyOperation. I decided to create an extension method that adds this method to the interface we just created:
module Essentially I'm creating a new method named AsyncMyOperation by calling Async.BuildPrimitive. Async.BuildPrimitive requires the Begin... and End... methods that are common in the .NET Framework for asynchronous operations. It then creates an Async<'a> that we can use in an async workflow. UPDATE: I previously created a local function to capture the request and handed that to Async.BuildPrimitive but I just noticed the overloads of BuildPrimitive that take additional arguments. You can supply up to three arguments. When you need to pass more (unlikely I'd say) you can always create a local function to capture additional arguments. Mind you, the module name I'm using in the code above really doesn't matter as long as you add an open Async where you want to use it. Right, now all we need to do is to create the async workflow to actually invoke the service:
let CallMyService = Please notice the exclamation mark in let! result = ... If you add a Debug.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString()) before and after the call you'll see that the code below the service call runs on a different thread than the lines above it.
Then, finally, you can run your async workflow with Async.Spawn CallMyService. You can use Async.Run but it would still block to wait for the result so that's probably not what you want.
Well, please let me know if this code works for you or not or any comments and questions you might have. 10月27日 Virtual Machine stepsHere's my list of things I do when I create a new virtual machine. Or at least I should do but I generally forget to do at least one of them:
* Install CCleaner to remove log files and other junk.
* Disable the annoying beep: net stop beep, sc config beep start= disabled
* Disable shutdown event tracker: gpedit.msc / Computer COnfiguration / Administrative Templates / System / Display Shutdown Event Tracker / Disabled
* Enable Shutdown without logon: Administrative Tools / Local Security Policy / Local Policies / Security Options / Shutdown: Allow system to be shut down without having to log on / Enabled.
* Install TweakUI and enable Logon / Autologon
* Disable screen saver
* Install Bginfo and show the computer name on the desktop.
There! Now I should stop forgetting these steps.
5月14日 EntLib 3.0 Hand-on labsThe EntLib 3.0 Hand-on labs haven't been updated for the april 2007 release. You may have to delete and add the references and update the App.config by replacing "2.0.0.0" with "3.0.0.0" and "PublicKeyToken=null" with "PublicKeyToken=b03f5f7f11d50a3a". Other than that, they're a handy intro. I finally have the chance to try these things out since the separate application block era. 4月29日 UI SmellJust like code smell I recently thought of the term UI smell. Apparently the term is already sort of used but not very much.
The system I'm currently participating on has a few:
I really feel sorry for the future users. .NET 2.0 Stream Compression & EncryptionA while ago I created a little application to store my passwords compressed and encrypted using XML serialization. I created it in .NET 1.1 so I could use it a my customer's site (poor me). It's compressed and encrypted XML in an XML container so I can use XmlSerializer all the way.
I handcrafted the streaming of the encryption and compression which was fun but took some time.
In .NET 2.0 this should be easier with CryptoStream and DeflateStream. The only tricky bit is how to get the compressed & encrypted data into and out of a MemoryStream properly. If you don't close the Crypto & Deflate stream they don't finalize their output properly and if you do close them they close the underlying MemoryStream. There's a way around this but it differs between the CryptoStream and DeflateStream. The sample code below shows how to do this (and these aren't my real passwords
The Save method required some tweaking, in short it does the following:
So, the CryptoStream has an extra method FlushFinalBlock() to tell the stream to finish its work. On the other hand DeflateStream is instructed to leave the underlying stream open. If the DeflateStream is then closed it will also finish its work. namespace Spikes 12月29日 My smart girlfriendWith the advent of Vista and the urge to install Ubuntu I decided to buy another hard disk. I couldn't resist buying another 150 Gb Raptor, of course totally overkill but that's not the point I wanted to make...
As I was trying figure out how to get the hard disk into the bay, my girlfriend walked in, stared at it blankly for a few seconds and then said "Can't you take out the whole bay?". When I looked more closely, it turned you she was entirely right!
Looks like she saved me some serious time trying to get the motherboard out of the way. Go girl! 12月26日 Finding your toolsI finally found a tool to download big files from my employer's intranet through the VPN. The VPN connection gets killed after some time, so it must be restartable. Today I found Robocopy included in the Windows Server 2003 Resource Kit Tools.
Then I used 7-Zip to scoop out robocopy.exe from the self-extracting .exe and the contained .msi. So no need to install anything.
Thank you Microsoft and thank you 7-Zip! 12月24日 NBearBrowsing CodePlex I found NBear, an ORM framework for .NET 2.0. Interesting? Well, I'll be damned if I know: apparently it's a chinese product; all the documentation and web sites are in chinese! Needless to say that diminishes my interest in the product somewhat... 12月22日 Human Methodologies 2In another not-so-recent ARCast Lewis Curtis and Brian Derda explain their new methodology Perspective Based Architecture. Now, I'm not an architect and I don't have any experience with this methodology but I found it an appealing methodology because:
Again a methodology with a strong social component. In my opinion methods like these have a promising future. 12月21日 Human Methodologies 1Just recently I read the following paragraph in the book "Agile Project Management with Scrum" by Ken Schwaber.
I used to teach people the theory, practices, and rules of Scrum. Now I teach them what Scrum feels like as it is implemented. I teach them how to recognize when things are going right and when they are going wrong. I provide exercises and discussions that let them experience the epiphanies so that they know what Scrum should feel like. Just as you don’t really know what it’s like to be someone else until you’ve walked however many miles in his or her shoes, you might not fully understand Scrum until you implement it yourself. But as you read this book, you will begin to understand what Scrum feels like and how you might feel using Scrum in your organization.
How a project management methodology feels? That's what I like about the recent progress in software development, things like XP and Scrum I find more straightforward, pragmatic and most of all, more human than previous methodologies.
This is why I'm enjoying software development more than ever, power to the people! Open XML in Office 2007 produces smaller files!In a not-so-recent ARCast I heard that the new Open XML format for Office documents actually produces smaller files. After downloading the update for Office 2003 to create Open XML files I was surprised to see that this is actually true! A few tries produced files 5x smaller!
Amazing, an open format, much more accessible (for developers that is) format and smaller files too! 12月20日 Find & replace special characters in WordI just pasted syntac coloured C# code from a Word document into the editor for this blog. The result was an empty line between each line of code, caused by a Paragraph tag. This in turn was caused by the Paragraph Mark which should be replaced by a Manual End of Line Mark (Shift-Enter).
To replace the Paragraph Mark with a Manual End of Line Mark in Word I tried to use find-and-replace ^v to ^| but Word couldn't find the Paragraph Marks, even though the ^v is inserted by a menu option on the same dialog (More / Special / Paragraph Character).
After googling I found this page explaining I should use ^13 instead of ^v. Odd, but it works! Easier .NET Service installation 1Below are two code snippets useful when creating a Windows Service in .NET.
Windows Services created as a .NET assembly are installed using InstallUtil. The code below allows installation and removal using the executable .NET assembly with the command-line options /i and /u respectively.
/// <summary> 2月16日 Previous blogMy previous blog is at http://yadnd.blogger.com (yadnd = yet another dot net developer). |
|
|