<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">DTaylor&amp;#39;s Blog</title><subtitle type="html">On the SharePoint Foundation 2010 Service Application Framework</subtitle><id>http://blogs.msdn.com/b/dtaylor/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/dtaylor/" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/b/dtaylor/atom.aspx" /><generator uri="http://telligent.com" version="5.6.50428.7875">Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><updated>2010-04-09T17:45:37Z</updated><entry><title>SharePoint 2010 Service Application Load Balancer</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/dtaylor/archive/2011/02/23/sharepoint-2010-service-application-load-balancer.aspx" /><id>http://blogs.msdn.com/b/dtaylor/archive/2011/02/23/sharepoint-2010-service-application-load-balancer.aspx</id><published>2011-02-23T23:34:40Z</published><updated>2011-02-23T23:34:40Z</updated><content type="html">&lt;p&gt;I’ve recently been asked some questions about the internal load balancer for service applications in SharePoint 2010, which I’ll summarize here.&lt;/p&gt;  &lt;h3&gt;What is the Service Application Load Balancer?&lt;/h3&gt;  &lt;p&gt;In order to simplify installation of multi-machine server farms, SharePoint provides a basic load balancer that can round-robin requests to Web service applications.&lt;/p&gt;  &lt;p&gt;This provides load balancing and fault-tolerance out-of-the-box for SharePoint service applications without requiring the administrator to be familiar with the intricacies of external load balancing solutions.&lt;/p&gt;  &lt;p&gt;If a deployment requires more advanced load balancing or fault tolerance capabilities, an administrator can opt to use an external load balancer.&lt;/p&gt;  &lt;h3&gt;How does it work?&lt;/h3&gt;  &lt;p&gt;A Service Application Proxy typically requests an endpoint for a connected Service Application from the load balancer, which is a software component that executes in the same process and application domain as the proxy.&lt;/p&gt;  &lt;p&gt;The load balancer maintains a complete list of available endpoints for each Service Application in a cache, and simply returns the next available endpoint to the proxy in a round-robin fashion.&lt;/p&gt;  &lt;h3&gt;How does it maintain the list of available service application endpoints?&lt;/h3&gt;  &lt;p&gt;For communication with service applications that are local to a SharePoint server farm, the load balancer looks into the configuration database to discover the available endpoints for a service application.&lt;/p&gt;  &lt;p&gt;In this case, the endpoint cache is updated whenever the list of available service application endpoints in the local configuration database changes. The delay in updating the cache is typically less than 1 minute.&lt;/p&gt;  &lt;p&gt;For communication with service applications in a remote server farm (i.e., federated services), the load balancer uses the Topology web service (aka, “Application Discovery and Load Balancer Service”) to discover the available endpoints for a service application.&lt;/p&gt;  &lt;p&gt;In this case, the list of service application endpoints is periodically retrieved from the Topology web service on the remote farm and copied into the local configuration database as an intermediate cache.&lt;/p&gt;  &lt;p&gt;This periodic retrieval is performed by the “Application Addresses Refresh” timer job. By default, this timer job executes every 15 minutes.&lt;/p&gt;  &lt;h3&gt;How does it handle failures?&lt;/h3&gt;  &lt;p&gt;The Service Application Proxy may report an endpoint failure to the load balancer, in which case the load balancer will remove the specified endpoint from the round-robin rotation for some period of time.&lt;/p&gt;  &lt;p&gt;By default, this period is 10 minutes (configurable using the &amp;quot;BadListPeriod” parameter of the Set-SPTopologyServiceApplicationProxy Cmdlet).&lt;/p&gt;  &lt;p&gt;If only one endpoint remains, it will not be removed from the rotation, even if a proxy reports a failure for that endpoint.&lt;/p&gt;  &lt;h3&gt;Is the Topology Web service a single point of failure for the load balancer?&lt;/h3&gt;  &lt;p&gt;No. The Topology web service application proxy is “self-balancing”. In other words, it uses the same round-robin load balancing algorithm to provide fault tolerance for itself.&lt;/p&gt;  &lt;p&gt;When an administrator creates a connection to a remote (federated) service application, the connection information includes one of the Topology web service application endpoints (selected at random) from the remote server farm. I’ll call this the “bootstrap” node.&lt;/p&gt;  &lt;p&gt;The bootstrap node is used to query the complete list of Topology web service application endpoints, which are then cached in the local SharePoint configuration database and used to round-robin all future requests to the Topology web service application.&lt;/p&gt;  &lt;p&gt;This cached list of Topology web service application endpoints is then updated periodically just like any other federated service application.&lt;/p&gt;  &lt;p&gt;So, the bootstrap node is only needed one time when an administrator creates a new connection (Service Application Proxy) to a remote service application.&lt;/p&gt;  &lt;h3&gt;What are the limitations of the load balancer?&lt;/h3&gt;  &lt;p&gt;There is an extreme case where connectivity to a federated service farm may be lost by replacing all of the servers in the remote farm within a single cache refresh interval (i.e., before the “Application Addresses Refresh” timer job can execute).&lt;/p&gt;  &lt;p&gt;To hit this case, you would need to bring down all of the servers hosting the Topology web service application in the service farm at once, and after they are all down, replace them all with servers that have different addresses, essentially moving the entire farm to a new set of servers at once rather than gradually over time.&lt;/p&gt;  &lt;p&gt;In this case, none of the Topology web services endpoints cached by the client farm would be valid, and the client could would not be able to acquire the all-new list of endpoints (because it needs at least one valid endpoint to query the list of new endpoints).&lt;/p&gt;  &lt;p&gt;To avoid this situation, at least one of the Topology web servers in the service farm should be maintained long enough for client farms to update their cache with at least one of the new Topology web service endpoints (at which point the old server can safely be removed). Alternatively, give at least one of the new servers the same name as one of the servers being replaced.&lt;/p&gt;  &lt;p&gt;Another limitation of the Service Application load balancer is that the list of available endpoints is maintained separately in the application domain of each caller, and there is no coordination between callers.&lt;/p&gt;  &lt;p&gt;This means that each proxy must independently discover that an endpoint is unavailable for some reason, which may translate to one failure per caller application domain (e.g., client application pool process) when a given server goes down unexpectedly.&lt;/p&gt;  &lt;p&gt;This also means that it is theoretically possible that some clients may achieve lock-step and send requests to the same servers in succession, thus achieving fault tolerance but not the most effective load balancing.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10133276" width="1" height="1"&gt;</content><author><name>dtaylorus</name><uri>http://blogs.msdn.com/dtaylorms/ProfileUrlRedirect.ashx</uri></author></entry><entry><title>Calculator Service Source Code</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/dtaylor/archive/2010/06/11/calculator-service-source-code.aspx" /><id>http://blogs.msdn.com/b/dtaylor/archive/2010/06/11/calculator-service-source-code.aspx</id><published>2010-06-11T09:52:03Z</published><updated>2010-06-11T09:52:03Z</updated><content type="html">&lt;p&gt;By request, see the attached file for an early look at the source code for the Calculator Service as a Visual Studio 2010 project.&lt;/p&gt;  &lt;p&gt;This is a work in progress. Some features are not yet implemented, and I haven’t yet explained some of the implemented features. Use at your own risk, no warranties implied, etc.&lt;/p&gt;  &lt;p&gt;Note that I’ve found that an iisreset is usually required after retracting and before re-deploying the solution.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8eb9d37f-1541-4f29-b6f4-1eea890d4876:c10c6af7-3391-4a53-b62f-00bcfde27a62" class="wlWriterEditableSmartContent"&gt;&lt;p&gt;&lt;div&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-01-30-65-metablogapi/5164.CalculatorService_5F00_3090D3BF.zip" target="_self"&gt;CalculatorService.zip&lt;/a&gt;&lt;/div&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10023430" width="1" height="1"&gt;</content><author><name>dtaylorus</name><uri>http://blogs.msdn.com/dtaylorms/ProfileUrlRedirect.ashx</uri></author><category term="Calculator Service Example" scheme="http://blogs.msdn.com/b/dtaylor/archive/tags/Calculator+Service+Example/" /></entry><entry><title>SharePoint Calculator Service Part 10 – Service Client</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/dtaylor/archive/2010/06/07/sharepoint-calculator-service-part-10-service-client.aspx" /><id>http://blogs.msdn.com/b/dtaylor/archive/2010/06/07/sharepoint-calculator-service-part-10-service-client.aspx</id><published>2010-06-08T01:37:30Z</published><updated>2010-06-08T01:37:30Z</updated><content type="html">&lt;p&gt;So far, we’ve been covering the service side of our Calculator service. We have a working service application that can be deployed and managed in a SharePoint server farm.&lt;/p&gt;  &lt;p&gt;In this article, we’ll switch focus to the client side. Remember that SharePoint service applications live in the middle-tier, so our “client” is actually another server—typically, a Web Front End server.&lt;/p&gt;  &lt;p&gt;For example, our client may be a web page or a web part that renders a calculator user interface for presentation in a browser.&lt;/p&gt;  &lt;p&gt;If you need a refresher on the various moving parts of a service application, you can refer to my previous post on &lt;a href="http://blogs.msdn.com/b/dtaylor/archive/2009/11/18/service-application-topologies.aspx"&gt;Service Application Topologies&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;Service Proxy and Service Application Proxy&lt;/h4&gt;  &lt;p&gt;The Service Proxy (SPServiceProxy) and Service Application Proxy (SPServiceApplicationProxy) objects represent the client components that communicate with a service.&lt;/p&gt;  &lt;p&gt;They are logically the client-side equivalents of the SPService and SPServiceApplication.&lt;/p&gt;  &lt;p&gt;In other words, in the same way that the SPService represents a service that has been registered in a SharePoint server farm, an SPServiceProxy represents a service client that has been registered in a SharePoint server farm. The SPServiceProxy represents the capability to connect to some SPService.&lt;/p&gt;  &lt;p&gt;Similarly, an SPServiceApplication represents a logical endpoint of a service in a SharePoint server farm, and a SPServiceApplicationProxy represents a connection to that logical endpoint.&lt;/p&gt;  &lt;p&gt;And, just as we have specialized SPIisWebService and SPIisWebServiceApplication classes for web services, we have specialized classes for web service clients:&amp;#160; SPIisWebServiceProxy and SPIisWebServiceApplicationProxy.&lt;/p&gt;  &lt;p&gt;We will derive classes from the abstract SPIisWebServiceProxy and SPIisWebServiceApplicationProxy classes and register them in the SharePoint configuration database in order to deeply integrate the client with the SharePoint administration experience and runtime.&lt;/p&gt;  &lt;p&gt;So let’s do it!&lt;/p&gt;  &lt;h4&gt;CalculatorServiceProxy&lt;/h4&gt;  &lt;p&gt;First, we’ll create our service proxy class:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7f250608-b81e-4235-bc28-3c93762d588e" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceProxy&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;SPIisWebServiceProxy&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; CalculatorServiceProxy(&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;SPFarm&lt;/span&gt; farm)&lt;/li&gt; &lt;li&gt;        : &lt;span style="color:#0000ff"&gt;base&lt;/span&gt;(farm)&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This is the class that we’ll register in the configuration database in order to tell SharePoint that our client classes are installed and ready to use.&lt;/p&gt;  &lt;h4&gt;&lt;/h4&gt;  &lt;h4&gt;CalculatorServiceApplicationProxy&lt;/h4&gt;  &lt;p&gt;Next, we’ll create our service application proxy class:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fa8eda53-716f-4fe2-bb67-94e09af7c4c0" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceApplicationProxy&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;SPIisWebServiceApplicationProxy&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af"&gt;Persisted&lt;/span&gt;]&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPServiceLoadBalancer&lt;/span&gt; loadBalancer;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; CalculatorServiceApplicationProxy(&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; name,&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;CalculatorServiceProxy&lt;/span&gt; serviceProxy,&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;Uri&lt;/span&gt; serviceApplicationAddress)&lt;/li&gt; &lt;li class="code-line-even"&gt;        : &lt;span style="color:#0000ff"&gt;base&lt;/span&gt;(name, serviceProxy, serviceApplicationAddress)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#008000"&gt;// Create a new round-robin load balancer&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.loadBalancer = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPRoundRobinServiceLoadBalancer&lt;/span&gt;(serviceApplicationAddress);&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Provision()&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#008000"&gt;// Provision the load balancer&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.loadBalancer.Provision();&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;base&lt;/span&gt;.Provision();&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Unprovision(&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; deleteData)&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000"&gt;// Unprovision the load balancer&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.loadBalancer.Unprovision();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;base&lt;/span&gt;.Unprovision(deleteData);&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPServiceLoadBalancer&lt;/span&gt; LoadBalancer&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.loadBalancer;&lt;/li&gt; &lt;li class="code-line-even"&gt;        }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Configuration&lt;/span&gt; Configuration&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; OpenClientConfiguration(&lt;span style="color:#2b91af"&gt;SPUtility&lt;/span&gt;.GetGenericSetupPath(&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#a31515"&gt;@&amp;quot;WebClients&amp;#92;Sample&amp;#92;Calculator&amp;quot;&lt;/span&gt;));&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This is the class that will be created on demand when an administrator chooses to create a connection to a new service application.&lt;/p&gt;  &lt;p&gt;The class is constructed like any other configuration object, with one additional parameter:&amp;#160; serviceApplicationAddress (lines 9-10).&lt;/p&gt;  &lt;h4&gt;Service Application Address and Load Balancer&lt;/h4&gt;  &lt;p&gt;The serviceApplicationAddress property identifies the service application to which the service application proxy will connect. Specifically, it must match the value of the CalculatorServiceApplication.Uri property.&lt;/p&gt;  &lt;p&gt;If you’re really observant, you may have noted that a service application actually has many addresses—one per service instance. Remember that a service application may be hosted on any number of servers, and the host on each server is called the service instance.&lt;/p&gt;  &lt;p&gt;For example, if our service application is hosted on two machines, server1 and server2, it will have two addresses: &lt;a href="http://server1:32843/&amp;hellip;/calculator.svc"&gt;http://&lt;strong&gt;server1&lt;/strong&gt;:32843/…/calculator.svc&lt;/a&gt; and &lt;a href="http://server2:32843/&amp;hellip;/calculator.svc"&gt;http://&lt;strong&gt;server2&lt;/strong&gt;:32843/…/calculator.svc&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So how can a service application have a single address in the object model?&lt;/p&gt;  &lt;p&gt;The answer is that the service application address is a &lt;em&gt;logical &lt;/em&gt;service address that can be resolved into many physical addresses at runtime—one physical address per service instance.&lt;/p&gt;  &lt;p&gt;The Service Application Framework takes care of this detail for us by providing the &lt;strong&gt;SPRoundRobinServiceLoadBalancer&lt;/strong&gt; class and the supporting Topology service. (I’ll save the details of how this works for a future post.)&lt;/p&gt;  &lt;p&gt;For now, suffice it to say that we can simply construct (line 13) and provision/unprovision (lines 16-31) the load balancer component with our service application proxy and get this functionality.&lt;/p&gt;  &lt;p&gt;We’ll also expose the load balancer object as an internal property for later use by our client runtime (lines 33-39).&lt;/p&gt;  &lt;h4&gt;Client Configuration&lt;/h4&gt;  &lt;p&gt;We’ll be using WCF to connect to our service application, and as a best practice we’ll keep the client settings in a configuration file.&lt;/p&gt;  &lt;p&gt;This is the client-side equivalent of having service settings in a web.config file. However, unlike the service side, our client assembly dll can be loaded by any arbitrary executable.&lt;/p&gt;  &lt;p&gt;This is a little tricky for the .NET configuration system, which supports configuration only at the exe scope and doesn’t support per-dll configuration. There simply isn’t a place we can drop a config file where it will be loaded by the .NET configuration system and recognized by WCF regardless of what exe (w3wp.exe, powershell.exe, someapp.exe, etc) loads our client dll.&lt;/p&gt;  &lt;p&gt;To solve this problem, we use the SharePoint OpenClientConfiguration helper method to reference a file named “client.config” in a well-known location.&lt;/p&gt;  &lt;p&gt;By convention, our deployment solution will drop the client.config file under the “WebClients” folder of the SharePoint installation. We separate our client.config file from all other config files by creating a subfolder (“Sample\Calculator”).&lt;/p&gt;  &lt;h4&gt;Calculator Client (Runtime)&lt;/h4&gt;  &lt;p&gt;Next, we’ll implement our calculator client. This is the public-facing class that clients, such as web parts, will use to interact with our service.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3a36e498-1210-43e2-b11c-b6cc1d8d8e1c" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 3em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorClient&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPServiceContext&lt;/span&gt; serviceContext;&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#008000"&gt;// Used to cache the client channel factory&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ChannelFactory&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ICalculatorServiceContract&lt;/span&gt;&amp;gt; s_ChannelFactory;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt; s_ChannelFactoryLock = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff"&gt;object&lt;/span&gt;();&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; CalculatorClient(&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;SPServiceContext&lt;/span&gt; serviceContext)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; == serviceContext)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;serviceContext&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.serviceContext = serviceContext;&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#808080"&gt;///&lt;/span&gt;&lt;span style="color:#008000"&gt; &lt;/span&gt;&lt;span style="color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#808080"&gt;///&lt;/span&gt;&lt;span style="color:#008000"&gt; Client method executed on WFE (front-end), for example, by a web part.&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#808080"&gt;///&lt;/span&gt;&lt;span style="color:#008000"&gt; &lt;/span&gt;&lt;span style="color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; Add(&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; a, &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; b)&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; result = 0;&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000"&gt;// Execute the service application method&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.ExecuteOnChannel(&lt;/li&gt; &lt;li&gt;            channel =&amp;gt; result = channel.Add(a, b));&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; result;&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;delegate&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CodeToExecuteOnChannel&lt;/span&gt;(&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;ICalculatorServiceContract&lt;/span&gt; channel);&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; ExecuteOnChannel(&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;CodeToExecuteOnChannel&lt;/span&gt; codeBlock)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; == codeBlock)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;codeBlock&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000"&gt;// Get the default service application proxy from the service context&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;CalculatorServiceApplicationProxy&lt;/span&gt; proxy = (&lt;span style="color:#2b91af"&gt;CalculatorServiceApplicationProxy&lt;/span&gt;)&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.serviceContext.GetDefaultProxy(&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;CalculatorServiceApplicationProxy&lt;/span&gt;));&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; == proxy)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;Calculator service application proxy not found.&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;SPServiceLoadBalancer&lt;/span&gt; loadBalancer = proxy.LoadBalancer;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; == loadBalancer)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;Calculator load balancer not found.&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;SPServiceLoadBalancerContext&lt;/span&gt; loadBalancerContext = loadBalancer.BeginOperation();&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPServiceContextScope&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.serviceContext))&lt;/li&gt; &lt;li&gt;            {&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#008000"&gt;// Get a channel to the service application endpoint&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#2b91af"&gt;IChannel&lt;/span&gt; channel = (&lt;span style="color:#2b91af"&gt;IChannel&lt;/span&gt;)GetChannel(proxy, loadBalancerContext.EndpointAddress);&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#0000ff"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                {&lt;/li&gt; &lt;li class="code-line-even"&gt;                    &lt;span style="color:#008000"&gt;// Execute the delegate&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    codeBlock((&lt;span style="color:#2b91af"&gt;ICalculatorServiceContract&lt;/span&gt;)channel);&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#008000"&gt;// Close the channel&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                    channel.Close();&lt;/li&gt; &lt;li&gt;                }&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#0000ff"&gt;finally&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                {&lt;/li&gt; &lt;li class="code-line-even"&gt;                    &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (channel.State != &lt;span style="color:#2b91af"&gt;CommunicationState&lt;/span&gt;.Closed)&lt;/li&gt; &lt;li&gt;                    {&lt;/li&gt; &lt;li class="code-line-even"&gt;                        channel.Abort();&lt;/li&gt; &lt;li&gt;                    }&lt;/li&gt; &lt;li class="code-line-even"&gt;                }&lt;/li&gt; &lt;li&gt;            }&lt;/li&gt; &lt;li class="code-line-even"&gt;        }&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;EndpointNotFoundException&lt;/span&gt;)&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            loadBalancerContext.Status = &lt;span style="color:#2b91af"&gt;SPServiceLoadBalancerStatus&lt;/span&gt;.Failed;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;finally&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            loadBalancerContext.EndOperation();&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ICalculatorServiceContract&lt;/span&gt; GetChannel(&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;CalculatorServiceApplicationProxy&lt;/span&gt; proxy,&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;Uri&lt;/span&gt; address)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#008000"&gt;// Check for a cached channel factory&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; == s_ChannelFactory)&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;lock&lt;/span&gt; (s_ChannelFactoryLock)&lt;/li&gt; &lt;li class="code-line-even"&gt;            {&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; == s_ChannelFactory)&lt;/li&gt; &lt;li class="code-line-even"&gt;                {&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#008000"&gt;// Get the endpoint configuration name&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                    &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; endpointConfigurationName = &lt;span style="color:#a31515"&gt;&amp;quot;http&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;                    &lt;span style="color:#008000"&gt;// Create a channel factory without specifying an endpoint address&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#008000"&gt;// so it can be cached and used for multiple endpoint addresses&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                    s_ChannelFactory = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ConfigurationChannelFactory&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ICalculatorServiceContract&lt;/span&gt;&amp;gt;(&lt;/li&gt; &lt;li&gt;                        endpointConfigurationName, proxy.Configuration, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;);&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#008000"&gt;// Configure the channel factory for claims-based authentication&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                    s_ChannelFactory.ConfigureCredentials(&lt;span style="color:#2b91af"&gt;SPServiceAuthenticationMode&lt;/span&gt;.Claims);&lt;/li&gt; &lt;li&gt;                }&lt;/li&gt; &lt;li class="code-line-even"&gt;            }&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; s_ChannelFactory.CreateChannelActingAsLoggedOnUser(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;EndpointAddress&lt;/span&gt;(address));&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The first thing to note about this class is that it doesn’t subclass any framework classes. This is an intentional decision on my part, because I want this public class to have longevity. If I choose to use some alternate framework down the road or maybe move from a web service to some other type of service, I want to protect my client code from these changes.&lt;/p&gt;  &lt;p&gt;So, I have intentionally made all of my framework subclasses internal to my implementation and have only exposed the CalculatorClient class to my consumers.&lt;/p&gt;  &lt;p&gt;Note that if my goal was to have the shortest sample code possible I could have merged some of these classes, but in this case I am prioritizing what I consider to be a best practice over code brevity.&lt;/p&gt;  &lt;h4&gt;SPServiceContext&lt;/h4&gt;  &lt;p&gt;The one part of the framework that is necessarily exposed by the client is SPServiceContext. SharePoint does require some context in order to be able to invoke a service method, and the SPServiceContext object wraps up all of that context into a a single object.&lt;/p&gt;  &lt;p&gt;Technically, this context could be acquired automatically in some cases. For example, the SPServiceContext.Current method is a static method that can acquire the necessary context in certain cases, for example, when executed by a web part.&lt;/p&gt;  &lt;p&gt;However, SPServiceContext.Current will return null in other situations, for example, when it cannot automatically detect the necessary context from the PowerShell console or from a timer job.&lt;/p&gt;  &lt;p&gt;So, it is not appropriate to use SPServiceContext.Current from general-purpose object model code such as CalculatorClient.&lt;/p&gt;  &lt;p&gt;Instead, the caller must provide this context to the object model using whatever SPServiceContext method is appropriate for the execution context, i.e., SPServiceContext.Current for a SharePoint web part or page context, or the SPServiceContextPipeBind object for a PowerShell cmdlet.&lt;/p&gt;  &lt;p&gt;I plan to cover more about SPServiceContext in depth in a future article. For now, you can just consider it a “black box” of context that gives SharePoint the runtime context for executing a service request, such as the context necessary for finding the appropriate service application proxy configured by the SharePoint farm administrator.&lt;/p&gt;  &lt;h4&gt;ExecuteOnChannel&lt;/h4&gt;  &lt;p&gt;ExecuteOnChannel is a private helper method that I wrote to wrap up all of the steps that are common to every service call. You can pass a delegate as a parameter and the delegate function will be executed on a WCF channel that has authenticated with the service application.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b9c9dedd-2934-483e-9c4b-ba60266cdb0e" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; ExecuteOnChannel(&lt;br /&gt;     &lt;span style="color:#2b91af"&gt;CodeToExecuteOnChannel&lt;/span&gt; codeBlock)&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;With some nice C# lambda expression syntax (lines 28-29), the code for calling a service method is fairly readable, and you don’t have the maintenance problems associated with copy-paste.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c5ec2d04-e048-4308-a370-8114e34be33a"&gt;   &lt;div class="code"&gt;     &lt;div style="padding-bottom: 2px; background-color: #ffffff; padding-left: 5px; padding-right: 5px; overflow: auto; padding-top: 2px"&gt;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.ExecuteOnChannel(channel =&amp;gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; result = channel.Add(a, b));&lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The first thing we do in ExecuteOnChannel is lookup our service application proxy (lines 45-51). We use the &lt;strong&gt;GetDefaultProxy&lt;/strong&gt; method on our SPServiceContext object, which knows how to find the proxy that the farm administrator has configured for the given context. More on how this works in a future article.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5017f8d2-fdc5-4b5d-aa4e-0b41ae484f8e" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="color:#2b91af"&gt;CalculatorServiceApplicationProxy&lt;/span&gt; proxy = (&lt;span style="color:#2b91af"&gt;CalculatorServiceApplicationProxy&lt;/span&gt;)&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.serviceContext.GetDefaultProxy(&lt;br /&gt;     &lt;span style="color:#0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;CalculatorServiceApplicationProxy&lt;/span&gt;));&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;From our service application proxy, we get our load balancer object (lines 53-57).&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:de01555c-179b-4672-abf3-aaa658447d76" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="color:#2b91af"&gt;SPServiceLoadBalancer&lt;/span&gt; loadBalancer = proxy.LoadBalancer;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Then, we tell the load balancer that we want to begin an operation using the &lt;strong&gt;BeginOperation&lt;/strong&gt; method (line 59).&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:210eeeaf-a9b2-4240-8a8e-cb5920525b55" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="color:#2b91af"&gt;SPServiceLoadBalancerContext&lt;/span&gt; loadBalancerContext = loadBalancer.BeginOperation();&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This returns an &lt;strong&gt;SPServiceLoadBalancerContext&lt;/strong&gt; object that we can use to get a service endpoint address using the loadBalancerContext.EndpointAddress property (line 65). Note that this address is a &lt;em&gt;physical&lt;/em&gt; endpoint address, in that it identifies a URI to which we can directly send a WCF message.&lt;/p&gt;  &lt;p&gt;We also use the load balancer context to report failures to the load balancer (lines 83-87).&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5392dedf-4272-4608-991c-331eaa076527" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="color:#0000ff"&gt;catch&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;EndpointNotFoundException&lt;/span&gt;)&lt;br /&gt; {&lt;br /&gt;     loadBalancerContext.Status = &lt;span style="color:#2b91af"&gt;SPServiceLoadBalancerStatus&lt;/span&gt;.Failed;&lt;br /&gt;     &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt;;&lt;br /&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;It is important to note that the consequence of reporting a failure to the load balancer is that the endpoint will temporarily be removed from rotation. In other words, the load balancer will not direct requests to that endpoint for some time.&lt;/p&gt;  &lt;p&gt;So, if the service method throws some exception that is expected given the inputs it would not be appropriate to report that exception as a failure to the load balancer, because the endpoint is working fine.&lt;/p&gt;  &lt;p&gt;It is only appropriate to report failures that indicate that the endpoint is unavailable or not functioning properly. In our example, if the endpoint cannot be found we report the failure and ensure that future requests will not be sent to this endpoint for some time.&lt;/p&gt;  &lt;p&gt;I plan to cover the details of the SPRoundRobinServiceLoadBalancer implementation in a future article, but for now your service client will function correctly by simply following this example.&lt;/p&gt;  &lt;p&gt;When the operation completes, we report this to the load balancer in a finally block using the &lt;strong&gt;EndOperation&lt;/strong&gt; method so that, for example, it can track statistics about in-flight operations for its internal load balancing algorithm.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d02d717f-3a48-45b6-af91-69cf794e0d4a" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="color:#0000ff"&gt;finally&lt;/span&gt;&lt;br /&gt; {&lt;br /&gt;     loadBalancerContext.EndOperation();&lt;br /&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;I’m going to postpone discussion of the SPServiceContextScope (line 62) for now. It’s not strictly necessary for this example, but it will come into play if we implement a partitioning scheme for hosted deployments in the future. I’m including it for now in case the code gets copy-pasted, since it makes the ExecuteOnChannel method more widely applicable.&lt;/p&gt;  &lt;p&gt;That leaves the code to actually acquire the WCF channel, execute the specified code on it, and clean up (lines 64-80). This is pretty standard WCF code, so I won’t go into detail.&lt;/p&gt;  &lt;h4&gt;GetChannel&lt;/h4&gt;  &lt;p&gt;The private GetChannel helper method is used by ExecuteOnChannel to acquire a WCF channel.&lt;/p&gt;  &lt;p&gt;It is important to note that we cache the WCF channel factory, which is a requirement to achieve great performance. We use a standard double-check lock (lines 99-103) and cache the channel factory in a static variable (lines 6-7).&lt;/p&gt;  &lt;p&gt;In order to enable the channel factory to be cached, we do not specify an endpoint address when creating the channel factory. If you recall the earlier discussion on load balancing, this is because each service request may be addressed to a different physical service instance (aka service host).&lt;/p&gt;  &lt;p&gt;Instead, we specify the endpoint address at the time the channel is created. So a given WCF channel is effectively bound to a single physical service instance, but each channel may be bound to a different service instance.&lt;/p&gt;  &lt;p&gt;As noted earlier in the Client Configuration section of this article, we want the channel factory to get its configuration from our client.config file. So we use the WCF &lt;strong&gt;ConfigurationChannelFactory&lt;/strong&gt; class to create our channel factory using the Configuration object specified by the service application proxy (lines 110-111).&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ab24cf5d-e1ab-44ac-a98a-acda910b04ad" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;s_ChannelFactory = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ConfigurationChannelFactory&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;ICalculatorServiceContract&lt;/span&gt;&amp;gt;(&lt;br /&gt;     endpointConfigurationName, proxy.Configuration, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;);&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;We also specify the endpoint configuration name from our client.config file, which I’ve currently hard-coded to “http” (line 106). More on supporting multiple endpoint addresses in a future article.&lt;/p&gt;  &lt;p&gt;Since our service application is configured for claims-based authentication, we use the &lt;strong&gt;ConfigureCredentials&lt;/strong&gt; extension method from the SAF SPChannelFactoryOperations class.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3d08ac1e-0625-42a4-8671-806752d639fb" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;s_ChannelFactory.ConfigureCredentials(&lt;span style="color:#2b91af"&gt;SPServiceAuthenticationMode&lt;/span&gt;.Claims);&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;And finally, we create the WCF channel using the &lt;strong&gt;CreateChannelActingAsLoggedOnUser&lt;/strong&gt; extension method from the SAF SPChannelFactoryOperations class, specifying the endpoint address from the load balancer context.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:304b515e-4913-447a-a012-7c1e6cd89646" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="color:#0000ff"&gt;return&lt;/span&gt; s_ChannelFactory.CreateChannelActingAsLoggedOnUser(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;EndpointAddress&lt;/span&gt;(address));&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This gives us a WCF channel that authenticates both the executing process and the signed-in user (i.e., using a SAML token that represents the process “acting as” the current user) to the service.&lt;/p&gt;  &lt;h4&gt;Client.config&lt;/h4&gt;  &lt;p&gt;Nothing really special here, but I’m including it for completeness. It’s a standard WCF config file with the binding copy-pasted from the service application web.config:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:377439f7-65a2-46bf-b3ff-d3b600d87eaf" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;client&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;endpoint&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;http&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;contract&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Sample.Calculator.Client.ICalculatorServiceContract&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;customBinding&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;bindingConfiguration&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;CalculatorServiceHttpBinding&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;client&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;customBinding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;binding&lt;/span&gt;&lt;/li&gt; &lt;li&gt;          &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;CalculatorServiceHttpBinding&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;          &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;security&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;authenticationMode&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;IssuedTokenOverTransport&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;allowInsecureTransport&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;true&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;          &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;binaryMessageEncoding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;readerQuotas&lt;/span&gt;&lt;/li&gt; &lt;li&gt;              &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;maxStringContentLength&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;1048576&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li class="code-line-even"&gt;              &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;maxArrayLength&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;2097152&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;          &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;binaryMessageEncoding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;          &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;httpTransport&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;maxReceivedMessageSize&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;2162688&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;authenticationScheme&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Anonymous&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;useDefaultWebProxy&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;false&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;customBinding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h4&gt;That’s all for now&lt;/h4&gt;  &lt;p&gt;At this point we have a completely functional service application client, however, we have a little more to do to integrate with the administrator user experience. Next time.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10021328" width="1" height="1"&gt;</content><author><name>dtaylorus</name><uri>http://blogs.msdn.com/dtaylorms/ProfileUrlRedirect.ashx</uri></author><category term="Calculator Service Example" scheme="http://blogs.msdn.com/b/dtaylor/archive/tags/Calculator+Service+Example/" /></entry><entry><title>SharePoint Calculator Service Part 9 – Claims Auth</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/dtaylor/archive/2010/05/12/sharepoint-calculator-service-part-9-claims-auth.aspx" /><id>http://blogs.msdn.com/b/dtaylor/archive/2010/05/12/sharepoint-calculator-service-part-9-claims-auth.aspx</id><published>2010-05-13T03:35:36Z</published><updated>2010-05-13T03:35:36Z</updated><content type="html">&lt;p&gt;One of the game-changing features of SharePoint 2010 is support for claims-based identities. It opens up a whole new set of exciting scenarios by blowing the doors off of the walled garden of the Active Directory. Well, maybe I exaggerate, but only slightly!&lt;/p&gt;  &lt;p&gt;In this article, we’ll modify our Calculator service application to support claims-based authentication (AuthN) and authorization (AuthZ).&lt;/p&gt;  &lt;h3&gt;About Claims-based Authentication&lt;/h3&gt;  &lt;p&gt;SharePoint has made a big bet on claims-based authentication in the 2010 release. In fact, it is the only type of authentication explicitly supported by the Service Application Framework.&lt;/p&gt;  &lt;p&gt;This decision unifies the authentication model used inside a SharePoint server farm and eliminates the complexities around supporting many different types of authentication.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;NOTE:&amp;#160; SharePoint 2010 still supports many &lt;strong&gt;sign-in&lt;/strong&gt; authentication options such as Windows authentication, for example, when a user signs-in to a SharePoint site from a browser. What we’re talking about here is authentication between the Web Front End tier and the Application Server tier inside a SharePoint server farm.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;I feel like I should draw a picture here:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart9ClaimsAu_E14E/AuthenticationOverview_4.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="AuthenticationOverview" border="0" alt="AuthenticationOverview" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart9ClaimsAu_E14E/AuthenticationOverview_thumb_1.png" width="420" height="298" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;In this article, we’re specifically talking about the “Claims (only)” arrow connecting the WFE tier to the Application Server tier where our Calculator service application is hosted.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;NOTE:&amp;#160; It is technically possible to implement your own authentication scheme, but you’ll find that there is no explicit support for this in the Service Application Framework. You’ll end up spending a bunch of time implementing your own authentication and authorization management infrastructure, and your service application will not support the many new scenarios enabled by claims authentication. In short, SharePoint administrators will likely be very unhappy to find this out when they deploy your service.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;If you’re interested in more details about some of the scenarios made possible by claims-based authentication, you can read the &lt;a href="http://msdn.microsoft.com/en-us/library/ee536164(v=office.14).aspx"&gt;MSDN documentation&lt;/a&gt; or check out the great resources on the &lt;a href="http://blogs.msdn.com/spidentity/"&gt;SPIdentity blog&lt;/a&gt; including three excellent videos linked in &lt;a href="http://blogs.msdn.com/spidentity/archive/2010/01/26/belated-intro-to-identity-in-sharepoint-2010.aspx"&gt;this post&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;On with the implementation!&lt;/h3&gt;  &lt;p&gt;First, we need to tell WCF that we want to use claims-based authentication with our service application.&lt;/p&gt;  &lt;p&gt;We do that by changing the service binding in our web.config:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0c81bc20-1e21-45b7-815c-aebfab7f714d" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div class="code-title-block"&gt;web.config&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;services&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;service&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;      &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Sample.Calculator.Service.CalculatorServiceContract&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;endpoint&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;address&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&amp;quot;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;contract&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Sample.Calculator.Service.ICalculatorServiceContract&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;customBinding&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;bindingConfiguration&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;CalculatorServiceHttpBinding&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;service&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;services&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;customBinding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;binding&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;CalculatorServiceHttpBinding&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;security&lt;/span&gt;&lt;/li&gt; &lt;li&gt;          &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;authenticationMode&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;IssuedTokenOverTransport&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li class="code-line-even"&gt;          &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;allowInsecureTransport&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;true&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;binaryMessageEncoding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;          &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;readerQuotas&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;maxStringContentLength&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;1048576&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;maxArrayLength&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;2097152&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;binaryMessageEncoding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;httpTransport&lt;/span&gt;&lt;/li&gt; &lt;li&gt;          &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;maxReceivedMessageSize&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;2162688&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li class="code-line-even"&gt;          &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;authenticationScheme&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;Anonymous&lt;/span&gt;&amp;quot;&lt;/li&gt; &lt;li&gt;          &lt;span style="color:#0000ff"&gt;&lt;/span&gt;&lt;span style="color:#ff0000"&gt;useDefaultWebProxy&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;false&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;binding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;customBinding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;bindings&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The interesting change here is that we specify a custom binding (lines 8, 13-29) with an authentication mode of &lt;strong&gt;IssuedTokenOverTransport&lt;/strong&gt; (line 17).&lt;/p&gt;  &lt;p&gt;This tells WCF to require a SAML token (containing claims about the authenticating party) in the security header of any messages sent to the service.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;allowInsecureTransport&lt;/strong&gt; option is required because we’re using HTTP as our transport (line 24), which means that the SAML token will be sent in plain-text over the wire to the service.&lt;/p&gt;  &lt;p&gt;This may be appropriate in scenarios where the physical network is considered secure (e.g., a private back-end LAN connecting WFE and App Server) and performance is the primary consideration.&lt;/p&gt;  &lt;p&gt;It’s also appropriate for this article because we haven’t yet covered service application endpoints (something we’ll do in the near future).&lt;/p&gt;  &lt;p&gt;We’ll also discuss WCF bindings that are supported and work well for service application scenarios in a future article.&lt;/p&gt;  &lt;p&gt;But for now, you can just consider the custom binding to be some magic configuration settings that enable our service to work with claims-based authentication.&lt;/p&gt;  &lt;p&gt;Next, we need to turn off IIS authentication, because IIS natively doesn’t know anything about SAML tokens. As far as IIS is concerned, connections to our service will be anonymous. Instead, WCF/WIF will take care of authentication.&lt;/p&gt;  &lt;p&gt;We do this in web.config as well:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c212d160-b9e1-4ce4-8045-5712a36e02c3" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;system.webServer&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;security&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;authentication&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;anonymousAuthentication&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;enabled&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;true&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;      &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;windowsAuthentication&lt;/span&gt;&lt;span style="color:#0000ff"&gt; &lt;/span&gt;&lt;span style="color:#ff0000"&gt;enabled&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt;false&lt;/span&gt;&amp;quot;&lt;span style="color:#0000ff"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;authentication&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;security&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;system.webServer&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Now, as far as IIS is concerned, we have enabled anonymous authentication.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;NOTE:&amp;#160; I regret that this last step is necessary, as it should have been the default configuration. It’s just one of those things that slipped through the cracks during the release cycle and unfortunately we’re probably stuck with it now, as a change to the default configuration would be a breaking change.&lt;/em&gt;&lt;/p&gt;  &lt;h3&gt;Configuring the Service Host Factory&lt;/h3&gt;  &lt;p&gt;Next, we need to implement a service host factory. This is necessary because it is the only WCF extensibility point where we can configure the service host for claims support due to the requirement that the service host be configured before it is opened.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;NOTE: If you already have a service host factory, you can continue to use it. Just follow along and insert the serviceHost.Configure method call in your CreateServiceHost override as described below.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;To do this, we’ll modify our calculator.svc file to reference a new service host factory class:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9f08994f-feb5-4d6d-a30b-c34ab2eaebd4" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div class="code-title-block"&gt;calculator.svc&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt;&lt;span style="color:#a31515"&gt;ServiceHost&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;  &lt;span style="color:#ff0000"&gt;Language&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#ff0000"&gt;Service&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Sample.Calculator.Service.CalculatorServiceContract, Sample.Calculator.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d5d38459f57e2f46&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;  &lt;span style="color:#ff0000"&gt;Factory&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Sample.Calculator.Service.CalculatorServiceHostFactory, Sample.Calculator.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d5d38459f57e2f46&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Line 4 is the only change from our original WCF service. It simply tells WCF to call our CalculatorServiceHostFactory when creating our service host.&lt;/p&gt;  &lt;p&gt;So now we need to implement the service host factory:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e51b6f3b-6de4-42d2-8bcc-e9314fa3f027"&gt;   &lt;div class="code"&gt;     &lt;div class="code-title-block"&gt;CalculatorServiceHostFactory.cs&lt;/div&gt;      &lt;div style="background: #ddd; overflow: auto"&gt;       &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2.5em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px"&gt;         &lt;li&gt;&lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CalculatorServiceHostFactory&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;WebServiceHostFactory&lt;/span&gt; &lt;/li&gt;          &lt;li class="code-line-even"&gt;{ &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ServiceHostBase&lt;/span&gt; CreateServiceHost( &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; constructorString, &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;[] baseAddresses) &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;ServiceHostBase&lt;/span&gt; serviceHost = &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.CreateServiceHost(constructorString, baseAddresses); &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008000"&gt;// Configure the service host for claims authentication&lt;/span&gt; &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; serviceHost.Configure(&lt;span style="color: #2b91af"&gt;SPServiceAuthenticationMode&lt;/span&gt;.Claims); &lt;/li&gt;          &lt;li&gt;&amp;#160; &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; serviceHost; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li class="code-line-even"&gt;} &lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The interesting code here is the call to &lt;strong&gt;serviceHost.Configure&lt;/strong&gt; (line 10). This is a C# extension method implemented in the Microsoft.SharePoint namespace (specifically, in the SPServiceHostOperations class). Don’t be confused by the extension method syntax. The Configure method is &lt;em&gt;not &lt;/em&gt;a WCF method on the ServiceHostBase class. It is a SharePoint method.&lt;/p&gt;  &lt;p&gt;This method internally does the following:&lt;/p&gt;  &lt;p&gt;1. It configures the service host to support authentication via Windows Identity Foundation (WIF).&lt;/p&gt;  &lt;p&gt;2. It configures the service host to use an authorization manager that enforces the service application security policy as configured by an administrator.&lt;/p&gt;  &lt;p&gt;3. It attaches a WCF behavior (implemented internally by the Service Application Framework) to the service host that handles an optional ServiceContext SOAP message header. A WCF client can use this header to enable correlation of diagnostic information across machine boundaries, to coerce the server thread locale to match the client request locale, and to support multi-tenancy or partitioning of a service application based on a SharePoint site subscription identifier.&lt;/p&gt;  &lt;p&gt;Each of these items deserves more explanation, but that’s for another time. For now, rest assured that the &lt;strong&gt;Configure&lt;/strong&gt; method is doing lots of nice things for your service application.&lt;/p&gt;  &lt;h3&gt;That’s it!&lt;/h3&gt;  &lt;p&gt;To summarize, we modified our service binding to support issued token authentication, made a single method call to configure our service host, and our service application magically supports claims-based authentication (AuthN) and authorization (AuthZ).&lt;/p&gt;  &lt;p&gt;For example, a farm administrator can now use the &lt;strong&gt;Permissions&lt;/strong&gt; button in the Service Applications Management page to grant or restrict access to our service application:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart9ClaimsAu_E14E/ServiceAppPermissionsButton_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ServiceAppPermissionsButton" border="0" alt="ServiceAppPermissionsButton" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart9ClaimsAu_E14E/ServiceAppPermissionsButton_thumb.png" width="531" height="397" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;By default, any identity that has the “Local Farm” claim will have “Full Control” access to the service application:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart9ClaimsAu_E14E/ServiceAppPermissions_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ServiceAppPermissions" border="0" alt="ServiceAppPermissions" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart9ClaimsAu_E14E/ServiceAppPermissions_thumb.png" width="542" height="500" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;In effect, this means that any process in the server farm can access the service application. So, services “just work” in a single farm topology by default.&lt;/p&gt;  &lt;p&gt;Administrators can customize these permissions to create the advanced topologies I wrote about in a &lt;a href="http://blogs.msdn.com/dtaylor/archive/2009/11/18/service-application-topologies.aspx"&gt;previous post&lt;/a&gt;, for example, restricting access to only a specific web application.&lt;/p&gt;  &lt;p&gt;Administrators can even use the &lt;strong&gt;Publish&lt;/strong&gt; ribbon button to make the Calculator service application available to clients outside the server farm (“service federation”), and thanks to claims-based authentication, the clients can even be in a different Active Directory domain. In fact, the clients don’t even have to be a member of a Windows domain or have an Active Directory available at all!&lt;/p&gt;  &lt;p&gt;As with the Administrators ribbon button that we look at in my &lt;a href="http://blogs.msdn.com/dtaylor/archive/2010/05/11/sharepoint-calculator-service-part-8-delegated-administration.aspx"&gt;last post&lt;/a&gt;, service implementers can customize the permissions to provide more granularity than just “Full Control” and enforce these permissions on a per-method basis rather than the basic “all-or-nothing” access enforced by the Connection Permissions settings.&lt;/p&gt;  &lt;h3&gt;Identity Delegation&lt;/h3&gt;  &lt;p&gt;Another feature we now have available to our service application is the end-user identity. We can inspect the end-user’s identity (as signed-in on the Web Front End) all the way back in the App Server tier where our service application is executing.&lt;/p&gt;  &lt;p&gt;This may seem like an obvious thing, but it wasn’t possible with Windows authentication without a PhD in Kerberos and domain administrator-level access to the Active Directory, because a feature called “delegation” of the user token is required to flow a Windows identity across multiple servers.&lt;/p&gt;  &lt;p&gt;Not so with SharePoint claims-based identities. Delegation works out of the box, no PhD required.&lt;/p&gt;  &lt;p&gt;We’re not taking advantage of this feature yet, but I’ve got a cool feature planned for the Calculator service that will make good use of it in a future article.&lt;/p&gt;  &lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10012236" width="1" height="1"&gt;</content><author><name>dtaylorus</name><uri>http://blogs.msdn.com/dtaylorms/ProfileUrlRedirect.ashx</uri></author><category term="Calculator Service Example" scheme="http://blogs.msdn.com/b/dtaylor/archive/tags/Calculator+Service+Example/" /></entry><entry><title>SharePoint Calculator Service Part 8 – Delegated Administration</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/dtaylor/archive/2010/05/11/sharepoint-calculator-service-part-8-delegated-administration.aspx" /><id>http://blogs.msdn.com/b/dtaylor/archive/2010/05/11/sharepoint-calculator-service-part-8-delegated-administration.aspx</id><published>2010-05-12T06:15:12Z</published><updated>2010-05-12T06:15:12Z</updated><content type="html">&lt;p&gt;In &lt;a href="http://blogs.msdn.com/dtaylor/archive/2010/05/10/sharepoint-calculator-service-part-7-custom-admin-setting-powershell.aspx"&gt;Part 7&lt;/a&gt; of this series, we created a cmdlet to allow an SharePoint farm administrator to easily modify settings of our Calculator service application using PowerShell.&lt;/p&gt;  &lt;p&gt;In this article, we’ll add support for delegated administration.&lt;/p&gt;  &lt;h3&gt;About Delegated Administration&lt;/h3&gt;  &lt;p&gt;One of the many cool new features of SharePoint 2010 is the ability to grant users the ability to manage a service application without giving them the keys to the entire farm (i.e., without making them a farm administrator).&lt;/p&gt;  &lt;p&gt;For example, when a delegated administrator accesses the SharePoint Central Administration site, they see the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedCentralAdmin_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="DelegatedCentralAdmin" border="0" alt="DelegatedCentralAdmin" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedCentralAdmin_thumb.png" width="523" height="276" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Notice that the only link available is the “Manage service applications” link.&lt;/p&gt;  &lt;p&gt;When a delegated administrator clicks the link with our current Calculator service implementation, they can’t view or manage our service application. They just see a blank list like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedServiceAppMgmtEmpty_4.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="DelegatedServiceAppMgmtEmpty" border="0" alt="DelegatedServiceAppMgmtEmpty" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedServiceAppMgmtEmpty_thumb_1.png" width="522" height="268" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;That’s because our service application doesn’t support delegated administration yet. Let’s fix that.&lt;/p&gt;  &lt;h3&gt;Implementing Delegated Administration&lt;/h3&gt;  &lt;p&gt;To add support for delegated administration, we override the &lt;strong&gt;AccessibleByDelegatedAdminGroup&lt;/strong&gt; method in the code-behind for our service application management aspx page. We return &lt;strong&gt;true&lt;/strong&gt; if the current user should have access to the page; otherwise, &lt;strong&gt;false&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Not so coincidentally, our service application class has a protected method named &lt;strong&gt;CheckAdministrationAccess&lt;/strong&gt; which will return the appropriate value based on the access granted by a server farm administrator.&lt;/p&gt;  &lt;p&gt;So, we just need to hook the AccessibleByDelegatedAdminGroup method of our page up to the CheckAdministrationAccess method of our service application.&lt;/p&gt;  &lt;p&gt;First, we implement the AccessibleByDelegatedAdminGroup method:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:477f4af7-5e03-4e36-9135-64e845b1f17b" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div class="code-title-block"&gt;ManageApplicationPage.aspx.cs&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ManageApplicationPage&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;GlobalAdminPageBase&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; AccessibleByDelegatedAdminGroup&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; allowed = &lt;span style="color:#0000ff"&gt;false&lt;/span&gt;;&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; serviceApplication = &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.ServiceApplication;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; != serviceApplication)&lt;/li&gt; &lt;li&gt;            {&lt;/li&gt; &lt;li class="code-line-even"&gt;                allowed = serviceApplication.CheckAdministrationPageAccess();&lt;/li&gt; &lt;li&gt;            }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; allowed;&lt;/li&gt; &lt;li class="code-line-even"&gt;        }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;If you remember &lt;a href="http://blogs.msdn.com/dtaylor/archive/2010/05/10/sharepoint-calculator-service-part-6-custom-admin-setting.aspx"&gt;Part 6&lt;/a&gt; of this series, we already implemented the ServiceApplication property which returns the Calculator service application object that the user wishes to manage from this page.&lt;/p&gt;  &lt;p&gt;The AccessibleByDelegatedAdminGroup simply returns the result of calling the CheckAdministrationPageAccess method on the service application (line 12).&lt;/p&gt;  &lt;p&gt;Now we just need to implement the CheckAdministrationPageAccess method on our service application:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4aa2a9af-0471-4344-bd11-95a48b6c44e8" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div class="code-title-block"&gt;CalculatorServiceApplication.c&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;SPIisWebServiceApplication&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; CheckAdministrationPageAccess()&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.CheckAdministrationAccess(&lt;span style="color:#2b91af"&gt;SPCentralAdministrationRights&lt;/span&gt;.Read);&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This method returns true if the current user has been granted “Read” administration access to the current service application; otherwise, it returns false.&lt;/p&gt;  &lt;h3&gt;That’s it!&lt;/h3&gt;  &lt;p&gt;Not much work, and we’ve enabled a SharePoint server farm administrator to delegate management of our Calculator service application to someone without having to make that person a farm administrator.&lt;/p&gt;  &lt;p&gt;This feature may be overkill for our simple Calculator service example, but it is a much-requested feature for complex service applications like Search.&lt;/p&gt;  &lt;p&gt;For example, it allows a farm administrator to appoint someone else to have full management control of a Search service application without the risk that this person may accidentally destroy the server farm by clicking the wrong links and changing server farm settings outside the Search service application.&lt;/p&gt;  &lt;p&gt;Since it’s so easy to implement, I don’t see any reason why you shouldn’t support this scenario for your service applications.&lt;/p&gt;  &lt;h3&gt;How to use it&lt;/h3&gt;  &lt;p&gt;To add a delegated administrator for our Calculator service application, you must first be logged in to the SharePoint Central Administration site as a server farm administrator.&lt;/p&gt;  &lt;p&gt;Select a Calculator service application from the Service Applications Management page in the Central Administration site and click the &lt;strong&gt;Administrators&lt;/strong&gt; button in the ribbon:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedAdministratorsButton_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="DelegatedAdministratorsButton" border="0" alt="DelegatedAdministratorsButton" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedAdministratorsButton_thumb.png" width="660" height="293" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Then, grant the desired delegated administrator(s) access to the service application:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedAdministratorAdd_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="DelegatedAdministratorAdd" border="0" alt="DelegatedAdministratorAdd" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedAdministratorAdd_thumb.png" width="660" height="469" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;em&gt;NOTE:&amp;#160; You may be wondering about the “Full Control” permission and whether or not other permissions are possible. The answer is yes, service implementers may customize the rights available to delegated administrators and enforce those rights in their service applications. That’s an advanced topic that we’ll cover in a future article.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;After clicking OK, when the delegated administrator navigates to the Service Applications Management page, they’ll see something like the following:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedServiceAppMgmt_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="DelegatedServiceAppMgmt" border="0" alt="DelegatedServiceAppMgmt" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedServiceAppMgmt_thumb.png" width="660" height="208" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Note that only the “Manage” ribbon button is enabled. All of the other ribbon buttons are disabled because they are actions only available to server farm administrators.&lt;/p&gt;  &lt;p&gt;Clicking the “Manage” button will allow the delegated administrator to manage the settings available for the Calculator service application:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedCalcServiceAppManagePage_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="DelegatedCalcServiceAppManagePage" border="0" alt="DelegatedCalcServiceAppManagePage" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart8Delegate_14329/DelegatedCalcServiceAppManagePage_thumb.png" width="660" height="269" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And that’s how delegated administration works. Enjoy!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10011429" width="1" height="1"&gt;</content><author><name>dtaylorus</name><uri>http://blogs.msdn.com/dtaylorms/ProfileUrlRedirect.ashx</uri></author><category term="Calculator Service Example" scheme="http://blogs.msdn.com/b/dtaylor/archive/tags/Calculator+Service+Example/" /></entry><entry><title>SharePoint Calculator Service Part 7 – Custom Admin Setting PowerShell</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/dtaylor/archive/2010/05/10/sharepoint-calculator-service-part-7-custom-admin-setting-powershell.aspx" /><id>http://blogs.msdn.com/b/dtaylor/archive/2010/05/10/sharepoint-calculator-service-part-7-custom-admin-setting-powershell.aspx</id><published>2010-05-11T06:29:24Z</published><updated>2010-05-11T06:29:24Z</updated><content type="html">&lt;p&gt;In &lt;a href="http://blogs.msdn.com/dtaylor/archive/2010/05/10/sharepoint-calculator-service-part-6-custom-admin-setting.aspx"&gt;Part 6&lt;/a&gt; of this series, we created a custom setting for our Calculator service application and a web page to manage the setting from the SharePoint Central Administration web site.&lt;/p&gt;  &lt;p&gt;In this article, we’ll create the accompanying PowerShell cmdlet so the setting can be scripted.&lt;/p&gt;  &lt;p&gt;The proposed syntax of the new cmdlet is:&lt;/p&gt;  &lt;div class="console"&gt;   &lt;p&gt;Set-CalculatorServiceApplication [-Identity] &amp;lt;SPServiceApplicationPipeBind&amp;gt; -Precision &amp;lt;Int32&amp;gt;&lt;/p&gt; &lt;/div&gt;  &lt;h3&gt;Create the Cmdlet&lt;/h3&gt;  &lt;p&gt;First, we’ll subclass SPCmdlet:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8e7b0399-705d-46a7-ae96-b118b5314b55" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af"&gt;Cmdlet&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;VerbsCommon&lt;/span&gt;.Set, &lt;span style="color:#a31515"&gt;&amp;quot;CalculatorServiceApplication&amp;quot;&lt;/span&gt;, SupportsShouldProcess = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;)]&lt;/li&gt; &lt;li class="code-line-even"&gt;[&lt;span style="color:#2b91af"&gt;SPCmdlet&lt;/span&gt;(RequireLocalFarmExist = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;, RequireUserFarmAdmin = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;)]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SetCalculatorServiceApplication&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;SPCmdlet&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af"&gt;Parameter&lt;/span&gt;(Mandatory = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;, Position = 0, ValueFromPipeline = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;)]&lt;/li&gt; &lt;li class="code-line-even"&gt;    [&lt;span style="color:#2b91af"&gt;ValidateNotNull&lt;/span&gt;]&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPServiceApplicationPipeBind&lt;/span&gt; Identity&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af"&gt;Parameter&lt;/span&gt;(Mandatory = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;)]&lt;/li&gt; &lt;li class="code-line-even"&gt;    [&lt;span style="color:#2b91af"&gt;ValidateRange&lt;/span&gt;(1, 20)]&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; Precision&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; InternalProcessRecord()&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000"&gt;// Read the service application identity from the pipebind parameter&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; serviceApplication = &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.Identity.Read() &lt;span style="color:#0000ff"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#008000"&gt;// Check for a valid service application&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; == serviceApplication)&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#008000"&gt;// Write an error&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            WriteError(&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;Calculator service application not found.&amp;quot;&lt;/span&gt;),&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#2b91af"&gt;ErrorCategory&lt;/span&gt;.InvalidArgument,&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.Identity);&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#008000"&gt;// Skip this record&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            SkipProcessCurrentRecord();&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (ShouldProcess(serviceApplication.Name))&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#008000"&gt;// Modify service application settings&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            serviceApplication.Precision = &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.Precision;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#008000"&gt;// Persiste the service application object&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            serviceApplication.Update();&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#008000"&gt;// Write the object to the pipeline&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            WriteObject(serviceApplication);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;This is very similar to the New-CalculatorServiceApplication cmdlet we created in Part 5 of this series, so feel free to review that article.&lt;/p&gt;  &lt;p&gt;The interesting code here is the Identity property of type &lt;strong&gt;SPServiceApplicationPipeBind&lt;/strong&gt; (lines 5-11), which allows a instance of our Calculator service application to be passed to our cmdlet. The parameter can either be a Guid identifier (as a string on the command line), a PowerShell variable that references an SPServiceApplication object, or an SPServiceApplication object on the pipeline.&lt;/p&gt;  &lt;p&gt;For example, given the following:&lt;/p&gt;  &lt;div class="console"&gt;   &lt;p&gt;PS C:\&amp;gt; Get-SPServiceApplication &lt;/p&gt;    &lt;p&gt;DisplayName&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TypeName&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Id      &lt;br /&gt;-----------&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --------&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --       &lt;br /&gt;Security Token Se... Security Token Se... 7d88501a-a3e0-4289-aa96-62048803b1fb       &lt;br /&gt;Application Disco... Application Disco... e79b6d9d-f7a0-4ac9-bdda-a9df8dc5e138       &lt;br /&gt;WSS_UsageApplication Usage and Health ... 7f75ee92-3930-4496-b1e2-743829f74cf4       &lt;br /&gt;My Calculator Ser... Sample.Calculator... 2b07ed87-e9af-40a2-8a59-8d6b746bb19b&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;We can then update the Precision setting of the above Calculator service application using any of the following commands:&lt;/p&gt;  &lt;div class="console"&gt;   &lt;p&gt;PS C:\&amp;gt; Set-CalculatorServiceApplication 2b07ed87-e9af-40a2-8a59-8d6b746bb19b -Precision 3 &lt;/p&gt;    &lt;p&gt;PS C:\&amp;gt; Get-SPServiceApplication 2b07ed87-e9af-40a2-8a59-8d6b746bb19b | Set-CalculatorServiceApplication -Precision 3 &lt;/p&gt;    &lt;p&gt;PS C:\&amp;gt; $app = Get-SPServiceApplication 2b07ed87-e9af-40a2-8a59-8d6b746bb19b      &lt;br /&gt;PS C:\&amp;gt; Set-CalculatorServiceApplication $app -Precision 3&lt;/p&gt; &lt;/div&gt;  &lt;h3&gt;Register the Cmdlet&lt;/h3&gt;  &lt;p&gt;Don’t forget to register the cmdlet (see &lt;a href="http://blogs.msdn.com/dtaylor/archive/2010/04/30/sharepoint-calculator-service-part-5-service-application-powershell.aspx"&gt;Part 5&lt;/a&gt; for details on the registration process):&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:187a14f2-4143-4ccd-8708-2367a4cee901" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;ps:Cmdlet&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;ps:VerbName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;Set-CalculatorServiceApplication&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;ps:VerbName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;ps:ClassName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;Sample.Calculator.Service.PowerShell.SetCalculatorServiceApplication&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;ps:ClassName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;  &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;ps:HelpFile&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;Sample.Calculator.Service.PowerShell.dll-help.xml&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;ps:HelpFile&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;ps:Cmdlet&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h3&gt;That’s it!&lt;/h3&gt;  &lt;p&gt;Administrators can now use our handy Set-CalculatorServiceApplication cmdlet to script the Precision setting.&lt;/p&gt; &lt;font size="2"&gt;&lt;/font&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10010748" width="1" height="1"&gt;</content><author><name>dtaylorus</name><uri>http://blogs.msdn.com/dtaylorms/ProfileUrlRedirect.ashx</uri></author><category term="Calculator Service Example" scheme="http://blogs.msdn.com/b/dtaylor/archive/tags/Calculator+Service+Example/" /></entry><entry><title>SharePoint Calculator Service Part 6 – Custom Admin Setting</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/dtaylor/archive/2010/05/10/sharepoint-calculator-service-part-6-custom-admin-setting.aspx" /><id>http://blogs.msdn.com/b/dtaylor/archive/2010/05/10/sharepoint-calculator-service-part-6-custom-admin-setting.aspx</id><published>2010-05-10T21:24:35Z</published><updated>2010-05-10T21:24:35Z</updated><content type="html">&lt;p&gt;In &lt;a href="http://blogs.msdn.com/dtaylor/archive/2010/04/30/sharepoint-calculator-service-part-5-service-application-powershell.aspx"&gt;Part 5&lt;/a&gt; of this series, we created a PowerShell cmdlet to enable SharePoint administrators to script deployment of our Calculator service application in a server farm.&lt;/p&gt;  &lt;p&gt;In this article, we’ll create a custom setting that administrators can use to modify the behavior of our service application.&lt;/p&gt;  &lt;p&gt;Specifically, we’ll create a new &lt;strong&gt;Precision&lt;/strong&gt; setting, which is defined as the number of significant digits that are used to represent the result of a calculation.&lt;/p&gt;  &lt;h3&gt;Create the setting&lt;/h3&gt;  &lt;p&gt;To do this, we’ll first add the setting to our CalculatorServiceApplication class.&lt;/p&gt;  &lt;p&gt;You might think that it would be challenging to create a setting that can be managed from a single location and made available to all servers in a server farm via a distributed multi-tier cache, but that’s actually the easiest part thanks to the SharePoint configuration object model:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3646c6bd-5859-46ac-899d-005107a892f1" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;SPIisWebServiceApplication&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af"&gt;Persisted&lt;/span&gt;]&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; precision;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; Precision&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.precision;&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; ((&lt;span style="color:#0000ff"&gt;value&lt;/span&gt; &amp;lt; 1) || (&lt;span style="color:#0000ff"&gt;value&lt;/span&gt; &amp;gt; 20))&lt;/li&gt; &lt;li class="code-line-even"&gt;            {&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ArgumentOutOfRangeException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li class="code-line-even"&gt;            }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.precision = &lt;span style="color:#0000ff"&gt;value&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The &lt;strong&gt;precision&lt;/strong&gt; field (line 4) represents the current precision setting for the service application, and the &lt;strong&gt;Precision&lt;/strong&gt; property (lines 6-22) implement a public property to get and set the field value.&lt;/p&gt;  &lt;p&gt;The key to integrating with the SharePoint configuration object model is the &lt;strong&gt;[Persisted]&lt;/strong&gt; attribute (line 3). This attribute instructs SharePoint to persist the field value in the SharePoint configuration database when the Update method is called, and to deserialize it when the class is read from the configuration database.&lt;/p&gt;  &lt;p&gt;That’s all it takes for the field value to be available on all machines in the server farm and automatically cached on demand for runtime access!&lt;/p&gt;  &lt;p&gt;&lt;em&gt;NOTE:&amp;#160; The Service Application Framework does not require service application settings to be stored in the SharePoint configuration database using the [Persisted] attribute described above. For example, if a service has an existing mechanism for storing settings, then that would be fine to use instead. However, you may find this persistence mechanism convenient in many cases.&lt;/em&gt;&lt;/p&gt;  &lt;h3&gt;Use the setting&lt;/h3&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;p&gt;Next, we’ll read this value at runtime and apply it to the result of our Add method:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7e595c77-3241-4fda-b23f-2373f9188d27" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceContract&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;ICalculatorServiceContract&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; Add(&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; a, &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; b)&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; RoundToPrecision(a + b);&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; ServiceApplication&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#008000"&gt;// Lookup executing service application in config db cache&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt;)&lt;span style="color:#2b91af"&gt;SPIisWebServiceApplication&lt;/span&gt;.Current;&lt;/li&gt; &lt;li class="code-line-even"&gt;        }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; RoundToPrecision(&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; value)&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000"&gt;// Get the current precision setting from the service application configuration&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; precision = &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.ServiceApplication.Precision;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#008000"&gt;// Quick-and-dirty round to specified precision&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt;.Parse(value.ToString(&lt;span style="color:#a31515"&gt;&amp;quot;G&amp;quot;&lt;/span&gt; + precision.ToString()), System.Globalization.&lt;span style="color:#2b91af"&gt;NumberStyles&lt;/span&gt;.Any);&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;First, we add a &lt;strong&gt;ServiceApplication &lt;/strong&gt;property to look up and return the executing Calculator service application (lines 8-15).&lt;/p&gt;  &lt;p&gt;&lt;em&gt;NOTE:&amp;#160; If we had implemented our contract as methods on the CalculatorServiceApplication, this step would be unnecessary, i.e., we could just use “this” to reference the current service application. However, in this example we’re assuming that we’re integrating an existing WCF service contract implementation with SharePoint.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Then, we get the precision setting from our service application using &lt;strong&gt;this.ServiceApplication.Precision&lt;/strong&gt; (line 20) and use it to round our result (line 23).&lt;/p&gt;  &lt;p&gt;&lt;em&gt;NOTE:&amp;#160; I couldn’t find a nice math function to round a number to an arbitrary precision, so I ended up converting the int to a string formatted to display the given precision and then converting the formatted string back to an int. Not something I’d recommend for production code.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;It is important to note that the ServiceApplication lookup (line 13) and the Precision setting (line 2) objects are cached in memory by the SharePoint configuration object model and &lt;strong&gt;should not be cached again&lt;/strong&gt;. This is a common implementation mistake and results in stale setting values. The reason is that SharePoint is smart about invalidating the cache and keeping it fresh when administrators make changes to settings, even from other machines in the server farm. If you cache the result of a lookup, the object will become stale and your application won’t see changes made by administrators until your service host process is recycled.&lt;/p&gt;  &lt;p&gt;So, simply follow the pattern above and lookup the setting on every access to ensure that you are reading the most recent value.&lt;/p&gt;  &lt;h3&gt;Manage the setting&lt;/h3&gt;  &lt;p&gt;Now let’s provide a way for the administrator to configure the setting. To do this, we’ll integrate with the “Manage” ribbon button on the Service Applications management page:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart6CustomSe_AB86/ServiceAppManageButton_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ServiceAppManageButton" border="0" alt="ServiceAppManageButton" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart6CustomSe_AB86/ServiceAppManageButton_thumb.png" width="505" height="296" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;First, we’ll create a management ASPX page:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3eb4fdbb-61ab-4c82-a0fc-fea58103a752" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div class="code-title-block"&gt;ManageApplication.aspx&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;content&lt;/span&gt; &lt;span style="color:#ff0000"&gt;contentplaceholderid&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;PlaceHolderMain&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;table&lt;/span&gt; &lt;span style="color:#ff0000"&gt;border&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;cellspacing&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;cellpadding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;width&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;100%&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;ms-propertysheet&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssuc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormSection&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#ff0000"&gt;Title&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Arithmetic Precision&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_Description&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssawc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;EncodedLiteral&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;text&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Arithmetic precision is the number of significant digits that are used to represent the result of a calculation.&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;EncodeMethod&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;#39;HtmlEncodeAllowSimpleTextFormatting&amp;#39;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_Description&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_InputFormControls&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssuc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormControl&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_LabelText&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssawc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;EncodedLiteral&lt;/span&gt; &lt;span style="color:#ff0000"&gt;text&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Precision:&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;EncodeMethod&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;HtmlEncode&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_LabelText&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_control&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssawc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormTextBox&lt;/span&gt; &lt;span style="color:#ff0000"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;PrecisionTextBox&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;PrecisionTextBox&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Precision&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;MaxLength&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;2&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Width&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;50&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;ms-input&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssawc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;EncodedLiteral&lt;/span&gt; &lt;span style="color:#ff0000"&gt;text&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;digits&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;EncodeMethod&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;HtmlEncode&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssawc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormRangeValidator&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                            &lt;span style="color:#ff0000"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;PrecisionValidator&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="color:#ff0000"&gt;Type&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Integer&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                            &lt;span style="color:#ff0000"&gt;MinimumValue&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;1&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="color:#ff0000"&gt;MaximumValue&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;20&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                            &lt;span style="color:#ff0000"&gt;ControlToValidate&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;PrecisionTextBox&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="color:#ff0000"&gt;ErrorMessage&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Specify an integer value in the range 1..20&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                            &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_control&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssuc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormControl&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_InputFormControls&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssuc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormSection&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssuc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;ButtonSection&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_Buttons&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;Button&lt;/span&gt; &lt;span style="color:#ff0000"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;OkButton&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;OnClick&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;OkButton_Click&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;UseSubmitBehavior&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;OK&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;ms-ButtonHeightWidth&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_Buttons&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssuc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;ButtonSection&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;table&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;content&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;em&gt;NOTE:&amp;#160; I removed a bunch of standard page template goo for readability.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Then, the code-behind:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a7c5bf9f-8662-437e-81dd-a5edf3219768" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div class="code-title-block"&gt;ManageApplication.aspx.cs&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af"&gt;PermissionSet&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;SecurityAction&lt;/span&gt;.Demand, Name = &lt;span style="color:#a31515"&gt;&amp;quot;FullTrust&amp;quot;&lt;/span&gt;)]&lt;/li&gt; &lt;li class="code-line-even"&gt;[&lt;span style="color:#2b91af"&gt;PermissionSet&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;SecurityAction&lt;/span&gt;.InheritanceDemand, Name = &lt;span style="color:#a31515"&gt;&amp;quot;FullTrust&amp;quot;&lt;/span&gt;)]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;ManageApplicationPage&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;GlobalAdminPageBase&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TextBox&lt;/span&gt; PrecisionTextBox;&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; OnLoad(&lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;base&lt;/span&gt;.OnLoad(e);&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (!Page.IsPostBack)&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; serviceApplication = &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.ServiceApplication;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; == serviceApplication)&lt;/li&gt; &lt;li&gt;            {&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;Service application not found.&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;            }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#008000"&gt;// Initialize controls from service application&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.PrecisionTextBox.Text = serviceApplication.Precision.ToString();&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; ServiceApplication&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#008000"&gt;// Lookup service application by querystring parameter&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#2b91af"&gt;Guid&lt;/span&gt; serviceApplicationGuid = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Guid&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;HttpContext&lt;/span&gt;.Current.Request.QueryString[&lt;span style="color:#a31515"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;]);&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPFarm&lt;/span&gt;.Local.GetObject(serviceApplicationGuid) &lt;span style="color:#0000ff"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; OkButton_Click(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (Page.IsValid)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#008000"&gt;// Update service application settings&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; serviceApplication = &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.ServiceApplication;&lt;/li&gt; &lt;li class="code-line-even"&gt;            serviceApplication.Precision = &lt;span style="color:#2b91af"&gt;Int32&lt;/span&gt;.Parse(PrecisionTextBox.Text);&lt;/li&gt; &lt;li&gt;            serviceApplication.Update();&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#008000"&gt;// Navigate back to the service application management page&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            RedirectOnOK();&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; PageToRedirectOnOK&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#a31515"&gt;&amp;quot;/_admin/ServiceApplications.aspx&amp;quot;&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; PageToRedirectOnCancel&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#a31515"&gt;&amp;quot;/_admin/ServiceApplications.aspx&amp;quot;&lt;/span&gt;; }&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The interesting bit of code here is the &lt;strong&gt;ServiceApplication&lt;/strong&gt; property (lines 24-32). Here we’re assuming that the URL used to navigate to the aspx page will include a querystring parameter named “id” with a value that matches the Guid identifier of the service application to be managed. This is necessary because, if you remember our discussion on &lt;a href="http://blogs.msdn.com/dtaylor/archive/2009/11/18/service-application-topologies.aspx"&gt;service application topologies&lt;/a&gt;, there may be more than one of our Calculator service applications in a server farm. We parse the Guid parameter and use it to look up the specified service application using the configuration object model (line 30).&lt;/p&gt;  &lt;p&gt;And finally, we’ll hook our new management page up to the ribbon by overriding the &lt;strong&gt;ManageLink &lt;/strong&gt;property of our service application:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:643b23be-6d6c-4af8-a4bd-6f078adcf4b0" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;SPIisWebServiceApplication&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPAdministrationLink&lt;/span&gt; ManageLink&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPAdministrationLink&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;/_admin/sample/calculator/manageapplication.aspx?id=&amp;quot;&lt;/span&gt; + &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.Id.ToString());&lt;/li&gt; &lt;li class="code-line-even"&gt;        }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Note that we include the “id” querystring parameter in the URL required by our management page (line 7).&lt;/p&gt;  &lt;h3&gt;That’s it!&lt;/h3&gt;  &lt;p&gt;We’ve added a configurable setting and a page to manage it:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart6CustomSe_AB86/CalcServiceAppManagePage_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="CalcServiceAppManagePage" border="0" alt="CalcServiceAppManagePage" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart6CustomSe_AB86/CalcServiceAppManagePage_thumb.png" width="660" height="269" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Administrators can create multiple service applications and configure each of them with a different setting.&lt;/p&gt;  &lt;p&gt;However, we don’t have a way for administrators to script this new setting using PowerShell. We’ll take care of that next time.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10010539" width="1" height="1"&gt;</content><author><name>dtaylorus</name><uri>http://blogs.msdn.com/dtaylorms/ProfileUrlRedirect.ashx</uri></author><category term="Calculator Service Example" scheme="http://blogs.msdn.com/b/dtaylor/archive/tags/Calculator+Service+Example/" /></entry><entry><title>SharePoint Calculator Service Part 5 – Service Application PowerShell</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/dtaylor/archive/2010/04/30/sharepoint-calculator-service-part-5-service-application-powershell.aspx" /><id>http://blogs.msdn.com/b/dtaylor/archive/2010/04/30/sharepoint-calculator-service-part-5-service-application-powershell.aspx</id><published>2010-05-01T01:28:00Z</published><updated>2010-05-01T01:28:00Z</updated><content type="html">&lt;p&gt;In &lt;a href="http://blogs.msdn.com/dtaylor/archive/2010/04/27/sharepoint-calculator-service-part-4-new-service-application-ui.aspx"&gt;Part 4&lt;/a&gt; of this series, we integrated our Calculator service application creation and provisioning experience with the SharePoint Central Administration site.&lt;/p&gt;  &lt;p&gt;While this provides a nice experience for ad-hoc SharePoint deployments, we would also like to support scripted deployments which are completely automated.&lt;/p&gt;  &lt;p&gt;In this article, we’ll build a PowerShell cmdlet to integrate our service application creation experience into the SharePoint 2010 Management Shell to support these scenarios.&lt;/p&gt;  &lt;p&gt;We’ll create a cmdlet named &lt;strong&gt;New-CalculatorServiceApplication&lt;/strong&gt; that will take two required parameters: the name of the new service application, and the application pool that will host it. The cmdlet will then create the new service application and provision it.&lt;/p&gt;  &lt;p&gt;Here’s the proposed syntax:&lt;/p&gt;  &lt;div class="console"&gt;   &lt;p&gt;PS&amp;gt; gcm New-CalculatorServiceApplication -syntax      &lt;br /&gt;New-CalculatorServiceApplication [-Name] &amp;lt;String&amp;gt; [-ApplicationPool] &amp;lt;SPIisWebServiceApplicationPoolPipeBind&amp;gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The SPIisWebServiceApplicationPoolPipeBind parameter accepts a service application pool object, which can be created by the New-SPServiceApplicationPool cmdlet. Alternatively, an administration can use the Get-SPServiceApplicationPool cmdlet to select an existing service application pool to be used for the new service application.&lt;/p&gt;  &lt;p&gt;The first thing we’ll do is create the &lt;strong&gt;New-CalculatorServiceApplication&lt;/strong&gt; cmdlet by subclassing &lt;strong&gt;SPCmdlet:&lt;/strong&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:16f0d278-5ac9-444a-99c2-fa976bb74c25" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div class="code-title-block"&gt;CalculatorServiceCmdlets.cs&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af"&gt;Cmdlet&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;VerbsCommon&lt;/span&gt;.New, &lt;span style="color:#a31515"&gt;&amp;quot;CalculatorServiceApplication&amp;quot;&lt;/span&gt;, SupportsShouldProcess = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;)]&lt;/li&gt; &lt;li class="code-line-even"&gt;[&lt;span style="color:#2b91af"&gt;SPCmdlet&lt;/span&gt;(RequireLocalFarmExist = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;, RequireUserFarmAdmin = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;)]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;NewCalculatorServiceApplication&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;SPCmdlet&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPIisWebServiceApplicationPoolPipeBind&lt;/span&gt; m_ApplicationPool;&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af"&gt;Parameter&lt;/span&gt;(Mandatory = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;, Position = 0)]&lt;/li&gt; &lt;li class="code-line-even"&gt;    [&lt;span style="color:#2b91af"&gt;ValidateNotNullOrEmpty&lt;/span&gt;]&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; Name&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af"&gt;Parameter&lt;/span&gt;(Mandatory = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;, Position = 1, ValueFromPipeline = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;)]&lt;/li&gt; &lt;li class="code-line-even"&gt;    [&lt;span style="color:#2b91af"&gt;ValidateNotNull&lt;/span&gt;]&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPIisWebServiceApplicationPoolPipeBind&lt;/span&gt; ApplicationPool&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;get&lt;/span&gt; { &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; m_ApplicationPool; }&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;set&lt;/span&gt; { m_ApplicationPool = &lt;span style="color:#0000ff"&gt;value&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; InternalProcessRecord()&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000"&gt;// Ensure that the farm level required objects exist&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;SPFarm&lt;/span&gt; farm = &lt;span style="color:#2b91af"&gt;SPFarm&lt;/span&gt;.Local;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; == farm)&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            ThrowTerminatingError(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;SharePoint server farm not found.&amp;quot;&lt;/span&gt;),&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#2b91af"&gt;ErrorCategory&lt;/span&gt;.ResourceUnavailable, &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000"&gt;// Ensure that the service exists&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;CalculatorService&lt;/span&gt; service = farm.Services.GetValue&amp;lt;&lt;span style="color:#2b91af"&gt;CalculatorService&lt;/span&gt;&amp;gt;();&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; == service)&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            ThrowTerminatingError(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;Calculator service not found.&amp;quot;&lt;/span&gt;),&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#2b91af"&gt;ErrorCategory&lt;/span&gt;.ResourceUnavailable, &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#008000"&gt;// Check for an existing sample web service application&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; existingServiceApplication = service.Applications.GetValue&amp;lt;&lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt;&amp;gt;();&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; != existingServiceApplication)&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            WriteError(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;Calculator service application exists.&amp;quot;&lt;/span&gt;),&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#2b91af"&gt;ErrorCategory&lt;/span&gt;.ResourceExists, existingServiceApplication);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#008000"&gt;// Skip the current record&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            SkipProcessCurrentRecord();&lt;/li&gt; &lt;li class="code-line-even"&gt;        }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#008000"&gt;// Get a reference to the specified application pool&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;SPIisWebServiceApplicationPool&lt;/span&gt; applicationPool = &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.ApplicationPool.Read();&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;null&lt;/span&gt; == applicationPool)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            WriteError(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;The specified application pool could not be found.&amp;quot;&lt;/span&gt;),&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#2b91af"&gt;ErrorCategory&lt;/span&gt;.InvalidArgument, &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;);&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#008000"&gt;// Skip the current record.&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            SkipProcessCurrentRecord();&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (ShouldProcess(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.Name))&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#008000"&gt;// Create the sample application&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; serviceApplication = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt;(&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.Name, service, applicationPool);&lt;/li&gt; &lt;li class="code-line-even"&gt;            serviceApplication.Update();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#008000"&gt;// Provision the sample application&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            serviceApplication.Provision();&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#008000"&gt;// Write the new sample application to the pipeline&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            WriteObject(serviceApplication);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The Cmdlet attribute (line 1) defines the cmdlet verb and noun.&lt;/p&gt;  &lt;p&gt;The SPCmdlet attribute (line 2) ensures that the local machine is joined to a SharePoint farm and that the caller is a farm administrator before the cmdlet is executed.&lt;/p&gt;  &lt;p&gt;The Name and ApplicationPool properties (lines 5-21) are the two cmdlet parameters. The SPIisWebServiceApplicationPoolPipeBind class is a SharePoint class that has associated cmdlets for creating and looking up application pools that can be passed to the cmdlet as the ApplicationPool parameter, i.e., New-SPServiceApplicationPool.&lt;/p&gt;  &lt;p&gt;The InternalProcessRecord method (lines 23-76) is where the work happens.&lt;/p&gt;  &lt;p&gt;Lines 25-50 simply validate the farm configuration.&lt;/p&gt;  &lt;p&gt;Line 53 reads the SPIisWebServiceApplicationPool parameter from the pipebind parameter.&lt;/p&gt;  &lt;p&gt;Lines 65-71 create and provision a Calculator service application, which should look familiar since it’s the same code we used in the Central Administration site UI.&lt;/p&gt;  &lt;p&gt;And finally, line 74 writes the new service application object out to the PowerShell pipeline where it can be piped as input to the next cmdlet in the pipeline.&lt;/p&gt;  &lt;p&gt;Now, we need to tell SharePoint Management Shell about our new cmdlet. This is done by first creating an xml registration file as follows:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d289d786-8a07-4f16-b661-a9bd3dca4d3c"&gt;   &lt;div class="code"&gt;     &lt;div class="code-title-block"&gt;CalculatorServiceApplicationCmdlets.xml&lt;/div&gt;      &lt;div style="background: #ddd; overflow: auto"&gt;       &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2.5em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px"&gt;         &lt;li&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:Config&lt;/span&gt; &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;xmlns:ps&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;urn:Microsoft.SharePoint.PowerShell&lt;/span&gt;&amp;quot; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;xmlns:xsi&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/span&gt;&amp;quot; &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;xsi:schemaLocation&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;urn:Microsoft.SharePoint.PowerShell SPCmdletSchema.xsd&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:Assembly&lt;/span&gt;&lt;span style="color: #0000ff"&gt; &lt;/span&gt;&lt;span style="color: #ff0000"&gt;Name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;Sample.Calculator.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d5d38459f57e2f46&lt;/span&gt;&amp;quot;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:Cmdlet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:VerbName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;New-CalculatorServiceApplication&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:VerbName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:ClassName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Sample.Calculator.Service.PowerShell.NewCalculatorServiceApplication&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:ClassName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:HelpFile&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Sample.Calculator.Service.PowerShell.dll-help.xml&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:HelpFile&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:Cmdlet&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:Assembly&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;          &lt;li class="code-line-even"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;ps:Config&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt; &lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;We simply register our assembly full name (line 5), our cmdlet verb and name (line 7), the class that implements the cmdlet (line 8), and a help file (line 9). We won’t actually create the help file for now since it’s optional.&lt;/p&gt;  &lt;p&gt;And finally, we’ll update our temporary installation batch file to copy the xml file to the appropriate location:&lt;/p&gt;  &lt;div class="console"&gt;   &lt;p&gt;xcopy /y &amp;quot;%_SETUPPATH%\PowerShell\*Cmdlets.xml&amp;quot; &amp;quot;%_INSTALLPATH%\Config\PowerShell\registration\*.*&amp;quot;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Done.&lt;/p&gt;  &lt;h3&gt;So what do we get for this code?&lt;/h3&gt;  &lt;p&gt;Well, it’s pretty simple for SharePoint administrators to create our service application from the Management Shell now:&lt;/p&gt;  &lt;div class="console"&gt;   &lt;p&gt;PS C:\&amp;gt; $appPool = Get-SPServiceApplicationPool CalculatorServiceAppPool      &lt;br /&gt;PS C:\&amp;gt; New-CalculatorServiceApplication &amp;quot;Calculator&amp;quot; $appPool &lt;/p&gt;    &lt;p&gt;DisplayName&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TypeName&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Id      &lt;br /&gt;-----------&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --------&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --       &lt;br /&gt;Calculator&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Sample.Calculator... 9ed7060a-618a-4363-8753-6b9b4d6a5d15&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The first command assigns the application pool named “CalculatorServiceAppPool” (which I previously created using the “New-SPServiceApplicationPool” cmdlet) to a variable, and the second command creates a new CalculatorServiceApplication with the name “Calculator” in the “CalculatorServiceApplicationAppPool”.&lt;/p&gt;  &lt;p&gt;Or, I can do this on one line using the PowerShell pipeline:&lt;/p&gt;  &lt;div class="console"&gt;   &lt;p&gt;PS C:\&amp;gt; Get-SPServiceApplicationPool CalculatorServiceAppPool | New-CalculatorServiceApplication &amp;quot;Calculator&amp;quot;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;I can also use the built-in cmdlets to manage the new service application. For example:&lt;/p&gt;  &lt;div class="console"&gt;   &lt;p&gt;PS C:\&amp;gt; Get-SPServiceApplication &lt;/p&gt;    &lt;p&gt;DisplayName&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TypeName&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Id      &lt;br /&gt;-----------&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --------&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; --       &lt;br /&gt;Security Token Se... Security Token Se... 7d88501a-a3e0-4289-aa96-62048803b1fb       &lt;br /&gt;Application Disco... Application Disco... e79b6d9d-f7a0-4ac9-bdda-a9df8dc5e138       &lt;br /&gt;WSS_UsageApplication Usage and Health ... 7f75ee92-3930-4496-b1e2-743829f74cf4       &lt;br /&gt;Calculator&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Sample.Calculator... 9ed7060a-618a-4363-8753-6b9b4d6a5d15&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;So there you have it—a PowerShell cmdlet that makes it easy for administrators to automate deployment of the Calculator service application.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10005592" width="1" height="1"&gt;</content><author><name>dtaylorus</name><uri>http://blogs.msdn.com/dtaylorms/ProfileUrlRedirect.ashx</uri></author><category term="Calculator Service Example" scheme="http://blogs.msdn.com/b/dtaylor/archive/tags/Calculator+Service+Example/" /></entry><entry><title>SharePoint Calculator Service Part 4 – New Service Application UI</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/dtaylor/archive/2010/04/27/sharepoint-calculator-service-part-4-new-service-application-ui.aspx" /><id>http://blogs.msdn.com/b/dtaylor/archive/2010/04/27/sharepoint-calculator-service-part-4-new-service-application-ui.aspx</id><published>2010-04-28T06:23:21Z</published><updated>2010-04-28T06:23:21Z</updated><content type="html">&lt;p&gt;In &lt;a href="http://blogs.msdn.com/dtaylor/archive/2010/04/09/sharepoint-calculator-service-part-3-the-service-application.aspx"&gt;Part 3&lt;/a&gt; of this series, we created a service application class that represents a logical endpoint of our Calculator service in the SharePoint server farm topology.&lt;/p&gt;  &lt;p&gt;We also created a temporary installer (a batch file) to put our service files in the right places on the disk. (We’ll revisit the proper way to do this in a future article.)&lt;/p&gt;  &lt;p&gt;And finally, we saw how an administrator can use PowerShell commands to create a new service application object and deploy our service to any server in the farm.&lt;/p&gt;  &lt;p&gt;Pretty neat, except that the PowerShell commands were far from intuitive. Time to fix that.&lt;/p&gt;  &lt;p&gt;In this article, we’ll see how to integrate our service application creation and provisioning experience with the SharePoint Central Administration web site. This will allow administrators to simply point and click to deploy a Calculator service application to servers in the farm.&lt;/p&gt;  &lt;p&gt;The first thing we’ll do is implement the &lt;strong&gt;IServiceApplicationAdministration&lt;/strong&gt; interface on our CalculatorService class:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:415720af-27b6-48a8-b55f-2f3fdcbfa00b" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div class="code-title-block"&gt;CalculatorService.cs&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;internal&lt;/span&gt; &lt;span style="color:#0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorService&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;SPIisWebService&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;IServiceAdministration&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;#region&lt;/span&gt; IServiceAdministration Members&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;[] GetApplicationTypes()&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt;[] { &lt;span style="color:#0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt;) };&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPPersistedTypeDescription&lt;/span&gt; GetApplicationTypeDescription(&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt; serviceApplicationType)&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (serviceApplicationType != &lt;span style="color:#0000ff"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt;))&lt;/li&gt; &lt;li class="code-line-even"&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;NotSupportedException&lt;/span&gt;();&lt;/li&gt; &lt;li class="code-line-even"&gt;        }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPPersistedTypeDescription&lt;/span&gt;(&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#a31515"&gt;&amp;quot;Calculator Service&amp;quot;&lt;/span&gt;,&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#a31515"&gt;&amp;quot;Performs calculations to demonstrate the SharePoint Service Application Framework.&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPAdministrationLink&lt;/span&gt; GetCreateApplicationLink(&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt; serviceApplicationType)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPAdministrationLink&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;/_admin/sample/calculator/createapplication.aspx&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPCreateApplicationOptions&lt;/span&gt; GetCreateApplicationOptions(&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt; serviceApplicationType)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#008000"&gt;// Do not support farm creation wizard&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPCreateApplicationOptions&lt;/span&gt;.None;&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPServiceApplication&lt;/span&gt; CreateApplication(&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; name,&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;Type&lt;/span&gt; serviceApplicationType,&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;SPServiceProvisioningContext&lt;/span&gt; provisioningContext)&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;NotSupportedException&lt;/span&gt;();&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPServiceApplicationProxy&lt;/span&gt; CreateProxy(&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; name,&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#2b91af"&gt;SPServiceApplication&lt;/span&gt; serviceApplication,&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;SPServiceProvisioningContext&lt;/span&gt; provisioningContext)&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;NotSupportedException&lt;/span&gt;();&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;#endregion&lt;/span&gt;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The &lt;strong&gt;GetApplicationTypes&lt;/strong&gt; method (lines 5-8) tells SharePoint the types of service applications that are supported by our service. In this case, we have one service application type:&amp;#160; CalculatorServiceApplication.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;GetApplicationTypeDescription&lt;/strong&gt; method (lines 10-21) return a user-friendly description of our service application type for display purposes.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;GetCreateApplicationLink&lt;/strong&gt; method (lines 23-27) return the URI of the ASPX page that provides the user interface for creating our service application. We’ll need to create this page later.&lt;/p&gt;  &lt;p&gt;We don’t need to implement the remaining interface methods for now—they are used for integrating with the Farm Configuration Wizard, which we’ll cover in a future article.&lt;/p&gt;  &lt;p&gt;Let’s take a look at what we get for this work:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart4AdminUI_139A3/NewServiceAppMenu_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="NewServiceAppMenu" border="0" alt="NewServiceAppMenu" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart4AdminUI_139A3/NewServiceAppMenu_thumb.png" width="479" height="197" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Nice! The Service Applications management page has a new “Calculator Service” drop-down menu item.&lt;/p&gt;  &lt;p&gt;If you click “New”, “Calculator Service” right now, you’ll see a “Page Not Found” error in your browser because we haven’t created the “createapplication.aspx” page yet. So let’s create it:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b6942a6b-b318-4594-ac43-c2ff60a6c63c" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div class="code-title-block"&gt;CreateApplication.aspx.cs&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceApplicationCreatePage&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;GlobalAdminPageBase&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TextBox&lt;/span&gt; ServiceApplicationNameTextBox;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IisWebServiceApplicationPoolSection&lt;/span&gt; ServiceApplicationPoolSection;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; OnLoad(&lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        ((&lt;span style="color:#2b91af"&gt;DialogMaster&lt;/span&gt;)Page.Master).OkButton.Enabled = &lt;span style="color:#0000ff"&gt;true&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;base&lt;/span&gt;.OnLoad(e);&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; OnInit(&lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/li&gt; &lt;li class="code-line-even"&gt;    {&lt;/li&gt; &lt;li&gt;        ((&lt;span style="color:#2b91af"&gt;DialogMaster&lt;/span&gt;)Page.Master).OkButton.Click += &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;EventHandler&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.OkButton_Click);&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;base&lt;/span&gt;.OnInit(e);&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; OkButton_Click(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (Page.IsValid)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#2b91af"&gt;CalculatorService&lt;/span&gt; service = &lt;span style="color:#2b91af"&gt;SPFarm&lt;/span&gt;.Local.Services.GetValue&amp;lt;&lt;span style="color:#2b91af"&gt;CalculatorService&lt;/span&gt;&amp;gt;();&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (service != &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;)&lt;/li&gt; &lt;li class="code-line-even"&gt;            {&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af"&gt;SPLongOperation&lt;/span&gt; longOperation = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;SPLongOperation&lt;/span&gt;(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;))&lt;/li&gt; &lt;li class="code-line-even"&gt;                {&lt;/li&gt; &lt;li&gt;                    longOperation.Begin();&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; serviceApplicationName = ServiceApplicationNameTextBox.Text.Trim();&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; serviceApplication = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;CalculatorServiceApplication&lt;/span&gt;(&lt;/li&gt; &lt;li class="code-line-even"&gt;                        serviceApplicationName,&lt;/li&gt; &lt;li&gt;                        service,&lt;/li&gt; &lt;li class="code-line-even"&gt;                        &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.ServiceApplicationPoolSection.GetOrCreateApplicationPool());&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;                    serviceApplication.Update();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;                    serviceApplication.Provision();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;                    longOperation.EndScript(&lt;span style="color:#a31515"&gt;&amp;quot;window.frameElement.commitPopup();&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;                }&lt;/li&gt; &lt;li class="code-line-even"&gt;            }&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            {&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#a31515"&gt;&amp;quot;The Calculator service is not installed.&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li class="code-line-even"&gt;            }&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li class="code-line-even"&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The protected members (lines 3-4) reference controls that will be used to prompt for the new service application name and application pool.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;OnLoad&lt;/strong&gt; and &lt;strong&gt;OnInit&lt;/strong&gt; methods (lines 6-18) enable the “OK” and “Cancel” buttons on the page, which is displayed as a dialog.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;OkButton_Click&lt;/strong&gt; method (lines 20-51) is called when the OK dialog button is clicked.&lt;/p&gt;  &lt;p&gt;Line 24 looks up our CalculatorService object in the configuration database. If it’s not found, we throw an exception (line 47). (It should be installed, otherwise the link to this page in the “New” drop-down menu wouldn’t be there.)&lt;/p&gt;  &lt;p&gt;Lines 27-29 start a new &lt;strong&gt;SPLongOperation&lt;/strong&gt;, which displays a fancy progress bar. This will give the administrator something nice to look at while SharePoint churns away deploying the new service application to all of our online service instances in the farm.&lt;/p&gt;  &lt;p&gt;Lines 33-38 create a new service application from the administrator input and persist it in the configuration database.&lt;/p&gt;  &lt;p&gt;Line 40 is where the magic happens. The Provision method instructs SharePoint to deploy the service application to all online Calculator service instances in the server farm, to include creating an IIS web site and virtual directory as necessary to host our WCF service.&lt;/p&gt;  &lt;p&gt;And finally, line 42 ends the SPLongOperation by closing the dialog window.&lt;/p&gt;  &lt;p&gt;Here’s the matching ASPX page:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f14e2835-ef6d-4a24-9071-31db63c16151" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div class="code-title-block"&gt;&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt; &lt;span style="color:#a31515"&gt;Page&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Language&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;C#&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Inherits&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Sample.Calculator.Service.UI.Administration.CalculatorServiceApplicationCreatePage, Sample.Calculator.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d5d38459f57e2f46&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;MasterPageFile&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;~/_layouts/dialog.master&amp;quot;&lt;/span&gt; &lt;span style="background:#ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&lt;span style="background:#ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt; &lt;span style="color:#a31515"&gt;Assembly&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Microsoft.SharePoint.ApplicationPages.Administration, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot;&lt;/span&gt;&lt;span style="background:#ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt; &lt;span style="color:#a31515"&gt;Assembly&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Name&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Microsoft.SharePoint.ApplicationPages.Administration&amp;quot;&lt;/span&gt; &lt;span style="background:#ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&lt;span style="background:#ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt; &lt;span style="color:#a31515"&gt;Register&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Tagprefix&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;wssawc&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Namespace&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Microsoft.SharePoint.WebControls&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Assembly&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c&amp;quot;&lt;/span&gt; &lt;span style="background:#ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt; &lt;span style="color:#a31515"&gt;Register&lt;/span&gt; &lt;span style="color:#ff0000"&gt;TagPrefix&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;wssuc&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;TagName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;InputFormSection&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;~/_controltemplates/InputFormSection.ascx&amp;quot;&lt;/span&gt; &lt;span style="background:#ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&lt;span style="background:#ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt; &lt;span style="color:#a31515"&gt;Register&lt;/span&gt; &lt;span style="color:#ff0000"&gt;TagPrefix&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;wssuc&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;TagName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;InputFormControl&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;~/_controltemplates/InputFormControl.ascx&amp;quot;&lt;/span&gt; &lt;span style="background:#ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt; &lt;span style="color:#a31515"&gt;Register&lt;/span&gt; &lt;span style="color:#ff0000"&gt;TagPrefix&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;wssuc&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;TagName&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;IisWebServiceApplicationPoolSection&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;src&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;~/_admin/IisWebServiceApplicationPoolSection.ascx&amp;quot;&lt;/span&gt; &lt;span style="background:#ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&lt;span style="background:#ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt; &lt;span style="color:#a31515"&gt;Import&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Namespace&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Microsoft.SharePoint&amp;quot;&lt;/span&gt; &lt;span style="background:#ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffee62"&gt;&amp;lt;%&lt;/span&gt;&lt;span style="color:#0000ff"&gt;@&lt;/span&gt; &lt;span style="color:#a31515"&gt;Import&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Namespace&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Microsoft.SharePoint.ApplicationPages&amp;quot;&lt;/span&gt; &lt;span style="background:#ffee62"&gt;%&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;Content&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ContentPlaceHolderId&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;PlaceHolderAdditionalPageHead&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssawc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;FormDigest&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;FormDigest&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;Content&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;Content&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ContentPlaceHolderId&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;PlaceHolderDialogHeaderPageTitle&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;Literal&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;#39;PageTitle&amp;#39;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Create New Calculator Service Application&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;Content&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;Content&lt;/span&gt; &lt;span style="color:#ff0000"&gt;contentplaceholderid&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;PlaceHolderDialogDescription&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;Literal&lt;/span&gt; &lt;span style="color:#ff0000"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;#39;PageDescription&amp;#39;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Specify the settings for this new service application.&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;Content&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;content&lt;/span&gt; &lt;span style="color:#ff0000"&gt;contentplaceholderid&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;PlaceHolderDialogBodyMainSection&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;table&lt;/span&gt; &lt;span style="color:#ff0000"&gt;border&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;cellspacing&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;cellpadding&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;width&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;100%&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;ms-propertysheet&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssuc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormSection&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#ff0000"&gt;Title&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_InputFormControls&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssuc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormControl&lt;/span&gt; &lt;span style="color:#ff0000"&gt;LabelText&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Service Application Name&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                    &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_Control&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssawc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormTextBox&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                            &lt;span style="color:#ff0000"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;ServiceApplicationNameTextBox&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="color:#ff0000"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;Name&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                            &lt;span style="color:#ff0000"&gt;maxlength&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;256&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="color:#ff0000"&gt;columns&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;35&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                            &lt;span style="color:#ff0000"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;ms-input&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssawc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormRequiredFieldValidator&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="color:#ff0000"&gt;ID&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;ServiceApplicationNameValidator&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                            &lt;span style="color:#ff0000"&gt;ControlToValidate&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;ServiceApplicationNameTextBox&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                            &lt;span style="color:#ff0000"&gt;ErrorMessage&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;You must specify a value for this required field.&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                            &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_Control&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;                &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssuc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormControl&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;Template_InputFormControls&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssuc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;InputFormSection&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;        &lt;span style="color:#0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;wssuc&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;IisWebServiceApplicationPoolSection&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#ff0000"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;ServiceApplicationPoolSection&amp;quot;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;            &lt;span style="color:#ff0000"&gt;runat&lt;/span&gt;&lt;span style="color:#0000ff"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;table&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li class="code-line-even"&gt;&lt;span style="color:#0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp&lt;/span&gt;&lt;span style="color:#0000ff"&gt;:&lt;/span&gt;&lt;span style="color:#a31515"&gt;content&lt;/span&gt;&lt;span style="color:#0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;And here’s a new line in our temporary installer batch file to copy the ASPX page to the right place on disk:&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3c9f03ec-758b-4600-9d77-1d55b8a6db8d" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;xcopy /y &amp;quot;%_SETUPPATH%&amp;#92;UI&amp;#92;Admin&amp;#92;*.aspx&amp;quot; &amp;quot;%_INSTALLPATH%&amp;#92;template&amp;#92;admin&amp;#92;Sample&amp;#92;Calculator&amp;#92;*.*&amp;quot;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;I won’t go through the ASPX code line-by-line, but here’s what it looks like after I filled in some values:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart4AdminUI_139A3/NewServiceAppDialog_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="NewServiceAppDialog" border="0" alt="NewServiceAppDialog" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart4AdminUI_139A3/NewServiceAppDialog_thumb.png" width="660" height="405" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Simply click the “OK” button to create and deploy the new service application to the farm:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart4AdminUI_139A3/NewServiceAppResult_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="NewServiceAppResult" border="0" alt="NewServiceAppResult" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart4AdminUI_139A3/NewServiceAppResult_thumb.png" width="660" height="332" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Note that SharePoint automatically provides the Delete, Publish, and Permissions pages. So administrators can publish your service application to remote server farms and manage who can access it—without any further coding!&lt;/p&gt;  &lt;p&gt;So there you have it—a deployment experience that fits our custom Calculator service neatly into the SharePoint Central Administration site just like the built-in services that ship with the product. Now SharePoint administrators will feel right at home creating and deploying our Calculator service in their server farms.&lt;/p&gt;  &lt;p&gt;No doubt some of you are noting that a few of the ribbon buttons are still disabled, namely, the Manage, Administrators, and Properties buttons. Never fear—we’ll fix that soon.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10003685" width="1" height="1"&gt;</content><author><name>dtaylorus</name><uri>http://blogs.msdn.com/dtaylorms/ProfileUrlRedirect.ashx</uri></author><category term="Calculator Service Example" scheme="http://blogs.msdn.com/b/dtaylor/archive/tags/Calculator+Service+Example/" /></entry><entry><title>SharePoint Calculator Service Part 3 – The Service Application</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/b/dtaylor/archive/2010/04/09/sharepoint-calculator-service-part-3-the-service-application.aspx" /><id>http://blogs.msdn.com/b/dtaylor/archive/2010/04/09/sharepoint-calculator-service-part-3-the-service-application.aspx</id><published>2010-04-10T00:45:37Z</published><updated>2010-04-10T00:45:37Z</updated><content type="html">&lt;p&gt;In &lt;a href="http://blogs.msdn.com/dtaylor/archive/2010/04/08/sharepoint-calculator-service-part-2.aspx"&gt;Part 2&lt;/a&gt; of this series, we integrated our Calculator service with the SharePoint server farm topology by extending the SPIisWebService and SPIisWebServiceInstance classes. These two classes allow administrators to use the SharePoint UX to view the topology and to start and stop our service host process on any server in the server farm. However, we haven’t yet created a service application to host, so this isn’t very useful yet.&lt;/p&gt;  &lt;p&gt;In this article, we’ll create a service application by extending the SPIisWebServiceApplication class.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:26080ab3-4cce-44bd-89a8-ef25b9f82a8d"&gt;   &lt;div class="code"&gt;     &lt;div class="code-title-block"&gt;CalculatorServiceApplication.cs&lt;/div&gt;      &lt;div style="background: #ddd; overflow: auto"&gt;       &lt;ol style="padding-bottom: 0px; margin: 0px 0px 0px 2.5em; padding-left: 5px; padding-right: 0px; background: #ffffff; padding-top: 0px"&gt;         &lt;li&gt;[System.Runtime.InteropServices.&lt;span style="color: #2b91af"&gt;Guid&lt;/span&gt;(&lt;span style="color: #a31515"&gt;&amp;quot;AF113976-8384-47CD-8055-0DD6C742B301&amp;quot;&lt;/span&gt;)] &lt;/li&gt;          &lt;li class="code-line-even"&gt;&lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; &lt;span style="color: #0000ff"&gt;sealed&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;CalculatorServiceApplication&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;SPIisWebServiceApplication&lt;/span&gt; &lt;/li&gt;          &lt;li&gt;{ &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;internal&lt;/span&gt; CalculatorServiceApplication( &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; name, &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;CalculatorService&lt;/span&gt; service, &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;SPIisWebServiceApplicationPool&lt;/span&gt; applicationPool) &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; : &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;(name, service, applicationPool) &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li&gt;&amp;#160; &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; InstallPath &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SPUtility&lt;/span&gt;.GetGenericSetupPath(&lt;span style="color: #a31515"&gt;@&amp;quot;WebServices\Sample.Calculator&amp;quot;&lt;/span&gt;); &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li&gt;&amp;#160; &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; VirtualPath &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;get&lt;/span&gt; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #a31515"&gt;&amp;quot;calculator.svc&amp;quot;&lt;/span&gt;; &lt;/li&gt;          &lt;li&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li class="code-line-even"&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/li&gt;          &lt;li&gt;} &lt;/li&gt;       &lt;/ol&gt;     &lt;/div&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The base class requires two abstract methods, InstallPath and VirtualPath, to be implemented.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;InstallPath&lt;/strong&gt; property (lines 12-18) tell SharePoint where to find our service files. This property should return the fully qualified path to a directory in the local server file system that contains our calculator.svc and web.config files. When the service application is provisioned (started) on a given server, SharePoint will create an IIS virtual directory that points to this path.&lt;/p&gt;  &lt;p&gt;In this implementation, I am using the SPUtility.GetGenericSetupPath() helper method which returns a path relative to the SharePoint installation directory, in this case, under the “WebServices\Sample.Calculator�� directory. Note that there will be other services in the “WebServices” directory, so be sure to use something unique, like your company name, as a prefix for your subdirectory.&lt;/p&gt;  &lt;p&gt;The &lt;strong&gt;VirtualPath&lt;/strong&gt; property (lines 20-26) tells SharePoint the URI of your service endpoint relative to the InstallPath directory, in this case, “calculator.svc”. This will be appended to the URI that identifies that IIS virtual directory where our service application is provisioned in IIS, for example, &lt;a href="http://server1/vdir/calculator.svc"&gt;http://server1/vdir/calculator.svc&lt;/a&gt;. SharePoint will take care of figuring out the base portion of the URI, e.g., &lt;a href="http://server1/serviceapp1"&gt;http://server1/serviceapp1&lt;/a&gt;, which is different for each server hosting our service (service instance) and for each service application. We just need to specify anything else that should be tacked on to the end of that path.&lt;/p&gt;  &lt;p&gt;Now to finish up, we need some way to create this directory on each server and install the calculator.svc and web.config files. Normally, you would do this using an MSI or a SharePoint solution, but to keep things simple for now, we’ll just use a batch file to xcopy the files.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b1826d85-150d-46a9-8f3d-89f19f580d94" class="wlWriterEditableSmartContent"&gt; &lt;div class="code"&gt; &lt;div class="code-title-block"&gt;install.cmd&lt;/div&gt; &lt;div style="background: #ddd; overflow: auto"&gt; &lt;ol style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;@echo off&lt;/li&gt; &lt;li class="code-line-even"&gt;setlocal&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;set _INSTALLUTIL=%SystemRoot%&amp;#92;Microsoft.NET&amp;#92;Framework64&amp;#92;v2.0.50727&amp;#92;InstallUtil.exe&lt;/li&gt; &lt;li&gt;set _INSTALLPATH=%CommonProgramFiles%&amp;#92;Microsoft Shared&amp;#92;web server extensions&amp;#92;14&lt;/li&gt; &lt;li class="code-line-even"&gt;set _APPNAME=Sample.Calculator&lt;/li&gt; &lt;li&gt;set _SETUPPATH=%~dp0.&lt;/li&gt; &lt;li class="code-line-even"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;echo Installing service from &amp;#39;%_SETUPPATH%&amp;#39; to &amp;#39;%_INSTALLPATH%&amp;#92;WebServices&amp;#92;%_APPNAME%&amp;#39;...&lt;/li&gt; &lt;li class="code-line-even"&gt;xcopy /y &amp;quot;%_SETUPPATH%&amp;#92;*.svc&amp;quot; &amp;quot;%_INSTALLPATH%&amp;#92;WebServices&amp;#92;%_APPNAME%&amp;#92;*.*&amp;quot;&lt;/li&gt; &lt;li&gt;xcopy /y &amp;quot;%_SETUPPATH%&amp;#92;web.config&amp;quot; &amp;quot;%_INSTALLPATH%&amp;#92;WebServices&amp;#92;%_APPNAME%&amp;#92;*.*&amp;quot;&lt;/li&gt; &lt;li class="code-line-even"&gt;%_INSTALLUTIL% &amp;quot;%_SETUPPATH%&amp;#92;%_APPNAME%.Service.dll&amp;quot;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li class="code-line-even"&gt;echo Setup complete.&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;A SharePoint administrator can run this batch file on each server in a farm to install the Calculator service. Note that the batch file assumes that the calculator.svc and web.config files are in the same directory as the batch file (line 7).&lt;/p&gt;  &lt;p&gt;That’s it! We’ve created a service application and a script to deploy it to a server farm.&lt;/p&gt;  &lt;h3&gt;So what do we get for this work?&lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Well, a SharePoint administrator can now create a Calculator service application and deploy it to all of the online Calculator service instances in the server farm using the PowerShell console. For example:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="console"&gt;   &lt;p&gt;PS&amp;gt; [System.Reflection.Assembly]::LoadWithPartialName(&amp;quot;Sample.Calculator.Service&amp;quot;)      &lt;br /&gt;PS&amp;gt; $instance = Get-SPServiceInstance | where { $_.GetType().Name -eq &amp;quot;CalculatorServiceInstance&amp;quot; } | select -first 1       &lt;br /&gt;PS&amp;gt; $service = $instance.Service       &lt;br /&gt;PS&amp;gt; $appPool = Get-SPServiceApplicationPool | select -first 1       &lt;br /&gt;PS&amp;gt; $app = New-Object Sample.Calculator.Service.Administration.CalculatorServiceApplication &amp;quot;CalculatorApp1&amp;quot;, $service, $appPool       &lt;br /&gt;PS&amp;gt; $app.Update()       &lt;br /&gt;PS&amp;gt; $app.Provision()&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;After executing these commands on any one server, we’ll have a brand new service application named “CalculatorApp1” deployed to all of the service instances in the server farm. And, the administrator can start and stop service instances to provision and un-provision the IIS-hosted web service on any server at any time.&lt;/p&gt;  &lt;p&gt;Here’s what our service application looks like in the “Manage Service Applications” UX:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart3TheServi_CAC9/ServiceApps1_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ServiceApps1" border="0" alt="ServiceApps1" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart3TheServi_CAC9/ServiceApps1_thumb.png" width="660" height="277" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And here’s what it looks like in IIS Manager (on a server where the Calculator service instance has been started):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart3TheServi_CAC9/IisServiceApp_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="IisServiceApp" border="0" alt="IisServiceApp" src="http://blogs.msdn.com/blogfiles/dtaylor/WindowsLiveWriter/SharePointCalculatorServicePart3TheServi_CAC9/IisServiceApp_thumb.png" width="660" height="276" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Note that SharePoint has created a virtual directory under the “SharePoint Web Services” IIS site, and that it contains our service files. The virtual directory name is a GUID which uniquely identifies the service application we created.&lt;/p&gt;  &lt;p&gt;If we create a second service application, another virtual directory will be created with a different identifier. However, both virtual directories will point to the same physical directory in the file system (the one we specified in our service application InstallPath property).&lt;/p&gt;  &lt;p&gt;So it works, but creating the service application sure wasn’t pretty. We’ll fix that next time.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9993523" width="1" height="1"&gt;</content><author><name>dtaylorus</name><uri>http://blogs.msdn.com/dtaylorms/ProfileUrlRedirect.ashx</uri></author><category term="Service Application Framework" scheme="http://blogs.msdn.com/b/dtaylor/archive/tags/Service+Application+Framework/" /><category term="Calculator Service Example" scheme="http://blogs.msdn.com/b/dtaylor/archive/tags/Calculator+Service+Example/" /></entry></feed>