According to the sad situation in nowadays front-end development, we have to check current browser type and version in JavaScript code and behave differently depend on that. There are many options to do so like this or this. But working in SharePoint 2010 environment you have one more, init.js defines browseris object (see on the picture below) which contains most of required data. Be free to rely on SharePoint in this case.
The next interesting question is “How to call this service?”(preferably in a strongly-typed way). The answer is simple, ServiceStack team have already made ​​this for us.  We can reuse types that designed for server-side code to make client code prettier. ServiceStack provides a list of different service clients for client applications.
Unfortunately, this example is already obsolete. Some time ago, ServiceStack released a brand new API that significantly changed programming approach, especially routing (for details see “ServiceStack’s new API design“). But I am happy to say that you can find an updated example below!
New design is more typed. In the previous version IService‘s methods returned the Object, but now Service returns concrete type that is defined by IReturn<T> interface of request message.
open System
open ServiceStack.ServiceHost
open ServiceStack.WebHost.Endpoints
type Hello = { mutable Name: string; }
type HelloResponse = { mutable Result: string; }
type HelloService() =
interface IService with
member this.Any (req:Hello) = { Result = "Hello, " + req.Name }
//Define the Web Services AppHost
type AppHost =
inherit AppHostHttpListenerBase
new() = { inherit AppHostHttpListenerBase("Hello F# Services", typeof<HelloService>.Assembly) }
override this.Configure container =
base.Routes
.Add<Hello>("/hello")
.Add<Hello>("/hello/{Name}") |> ignore
//Run it!
[<EntryPoint>]
let main args =
let host = if args.Length = 0 then "http://*:1337/" else args.[0]
printfn "listening on %s ..." host
let appHost = new AppHost()
appHost.Init()
appHost.Start host
Console.ReadLine() |> ignore
0
Update: An example of ServiceStack New API for F# 2.0 users. F# 2.0 does not have val keyword / auto-properties which were used in the first example.
</pre>
open System
open ServiceStack.ServiceHost
open ServiceStack.WebHost.Endpoints
open ServiceStack.ServiceInterface
type Project() =
let mutable projectID = 0
let mutable projectName = ""
let mutable companyName = ""
let mutable projectStatus = ""
member this.ProjectID with get() = projectID and set(pid) = projectID <-pid
member this.ProjectName with get() = projectName and set(pn) = projectName <- pn
member this.CompanyName with get() = companyName and set(cn) = companyName <- cn
member this.ProjectStatus with get() = projectStatus and set(ps) = projectStatus <-ps
type ProjectResponse() =
let mutable projects = List.empty<Project>
member this.Projects with get() = projects and set(pr) = projects <- pr
[<Route("/Project/{ProjectName}")>]
type ProjectRequest() =
let mutable projectName = ""
interface IReturn<ProjectResponse>
member this.ProjectName with get() = projectName and set(n) = projectName <- n
type ProjectService() =
inherit Service()
member this.Any (request:ProjectRequest) =
ProjectResponse(
Projects = [Project(ProjectName=request.ProjectName, ProjectID=1, CompanyName="A")])
//Define the Web Services AppHost
type AppHost() =
inherit AppHostHttpListenerBase("Project F# Services", typeof<ProjectService>.Assembly)
override this.Configure container = ignore()
//Run it!
[<EntryPoint>]
let main args =
let host = if args.Length = 0 then "http://*:8080/" else args.[0]
printfn "listening on %s ..." host
let appHost = new AppHost()
appHost.Init()
appHost.Start host
Console.ReadLine() |> ignore
0
<pre>
Image blurring is a king of popular task during presentation preparation. For example, if you want show something but hide sensitive information. Of course you can buy Photoshop but it is too expensive for such a simple task. Also you can download Paint.NET, but this is not an option for F# geek – it is too easy=). It is much better to write something by yourself (Binaries are available as well as source code).
The greatest event of this week and maybe of the year is 2013 MVP Global Summit. But while our MVPs make history, the new portion of news from this past week is waiting for you =).