Saturday, 3 November 2012

WCF Tips and Tricks



WCF Tips and Tricks[a selection] from the field
Christian Weyer, thinktecture
christian.weyer@thinktecture.com
andChristian Weyer

Support & consulting for Windows and .NET software developers and architects
Developer coaching and mentoring
Architecture consulting and prototyping
Architecture and code reviews
Applicationoptimization, troubleshooting, debugging
Focus on distributed applications, service orientation, workflows, cloud computing, interoperability, security, end-to-end solutions
Windows Server, WCF, WF, MSMQ, Azure Services, Windows Azure
http://www.thinktecture.com
christian.weyer@thinktecture.com

2
For starters: Super-duper TIP
WCF is not just Web Services !
WCF is not always about SOA !
WCF does not stand for
Web Services Consumption Foundation
Windows Cool-SOA Foundation
It is the Windows CommunicationFoundation!

3
Agenda –Dealing with...
Consuming
Hosting
Bindings
Quotas & throttles
Metadata/WSDL
Performance & throughput
Large data
Tracing

Problems èSolutions/Tips è
Samples4
Notcovered, some...
Contract modelling
REST
Security
Asynchronous processing
Fault handling
Deep extensibility
WF integration
NATs & firewalls
... and surely more ...

5
Consuming–Problems
Do I always need to create a proxy class from WSDL/MEX?
How can I make consuming services more robust?
Is there a way to improve performance when calling services?
How can I call in-process ‘services’ and WCF services in the same way?

6
Consuming–Solutions I
For non-interopno need to use svcutil.exeor ‘Add Service Reference’
shared contracts approach works good in WCF-to-WCF scenarios
ChannelFactory<T>and DuplexChannelFactory<T> are powerful means
use custom interface extending service contract & IClientChannel
Avoid usingstatement when dealing with proxies (ICommunicationObject-derivedobjects)
can still throw at end of using block, e.g. for network errors
explicit exception handling; can be dealt withe.g. in extension method

7
Consuming–Solutions II
Try to cache proxy or ChannelFactoryin high-throughput applications
creating them can mean significant overhead
ASP.NET client applications should not create ChannelFactoryon each page call
Abstract away channel/proxy creation details with Activator.CreateInstance& ChannelFactory<T>
Service Agent pattern
for local and remote services
no WCF-isms available, like sessions etc.
WCF 4.0 will offer in-process, intra-AppDomainchannel

8
Consuming–Samplesinterface IMyContractChannel: IMyContract, System.ServiceModel.IClientChannel{}
ChannelFactory<IMyContractChannel> cf= new ChannelFactory<IMyContractChannel>(binding, address);
IMyContractChannelclient = cf.CreateChannel();
client.DoIt(…);
client.Close();try{… client.Close();}catch (CommunicationExceptione){… client.Abort();}catch (TimeoutExceptione){… client.Abort();}catch (Exception e){… client.Abort();throw;}
IMyContractChannelchannel=
ChannelFactoryManager<IMyContractChannel>
.GetChannel("BasicHttpBinding");
Client sideClient side
Client side
Client side9
Hosting-Problems
Which host to use? IIS/WAS or a self-host?
How do I inject logic in IIS/WAS hosting?

10
Hosting–Solutions
Use IIS/WAS for robust, highly scalable services
beware of the process & AppDomainlifecycle features
when using non-HTTP (TCP, Named Pipes, MSMQ) with WAS hosting AppDomainrecycling still comes into your way
Use self-hosting in Windows Service to have full control and light-weight hosting environment
Custom ServiceHost& ServiceHostFactoryimplementations to provide custom initialization code
hook up factory in .svcfile for IIS/WAS

11
Hosting–Samplesclass MyServiceHost: System.ServiceModel.ServiceHost{public MyServiceHost(Type serviceType, paramsUri[] baseAddresses): base(serviceType, baseAddresses){...}protected override void ApplyConfiguration(){...}}
class MyServiceHostFactory: System.ServiceModel.Activation.ServiceHostFactory
{
protected override ServiceHostCreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return new MyServiceHost(serviceType, baseAddresses);
}
}
<%@ ServiceHostLanguage="C#" Debug="true" Service="MediaService" Factory="MyServiceHostFactory" %>Custom ServiceHost
Custom ServiceHostFactory
.svc file12
Bindings-Problems
MyWCF serviceisslow, whatishappening?
I wanttouseHTTP but not necessarilyangle brackets(aka‚XML‘)
HowcanI choosefromthebestcommunicationoptions?
13
Bindings–Solutions I
Beware of using the wrong bindings
e.g. Visual Studio WCF wizards use WsHttpBinding(heavy with message security & session-based)
only use features you really need
Think about the real need for session-bound channels/bindings
sessions change the game of fault and error handling
use sessions when you need session semantics in your service
But: sessions cangive performance improvements
e.g. security token hand-shake happens only once with SecureConversation
14
Bindings–Solutions II
Custom bindings will save your day
e.g. binary over HTTP often a good trade-off for WCF-to-WCF communication scenarios
build custom binding in configor code
Create user-defined binding for easier re-usage
bake common custom binding setups into re-usable code and configimplementations
Use a custom encoder for providing encoding-level tweaks & optimizations
e.g. enhanced text encoder in SDK or FastInfoSetencoder from 3rdparty
15
Bindings-Samples
<extensions>
<bindingExtensions>
<add name="netHttpBinding"
type="NetHttpBindingCollectionElement, Thinktecture.ServiceModel, Version=…" />
</bindingExtensions>
</extensions>
<bindings>
<netHttpBinding>
<binding name="unsecureNetHttp" securityMode="None" />
</netHttpBinding>
<customBinding>
<binding name="binaryHttp">
<binaryMessageEncoding/>
<httpTransport/>
</binding>
</customBinding>
</bindings>
public class NetHttpBinding:
System.ServiceModels.Channels.Binding,
ISecurityCapabilities
{
HttpTransportBindingElementhttpTransport;
HttpsTransportBindingElementhttpsTransport;
BinaryMessageEncodingBindingElementbinaryEncoding;
NetHttpSecurityModesecurityMode;
...
}app/web.config
User-defined binding16
Quotas & Throttles -Problems
Beyond Hello World, all my services and consumers fail with strange exceptions
My services do not perform the way they are supposed to
How can I teach WCF to be less ‘conservative’ in Intranet environments?

17
Quotas & Throttles -Solutions
Bindings
adjust buffers, connection limits, timeouts
Behaviors
configure throttling service behavior
Serializers
check maximum items in object graph value
Custom ChannelFactoryand ServiceHostcan automate all this
e.g. through profiles

Defaultsnot true!
SvcConfigEditor18
Quotas & Throttles -Samples
<bindings>
<webHttpBinding>
<binding name="rawStreamingWeb" transferMode="StreamedResponse">
<readerQuotasmaxArrayLength="999999999"/>
</binding>
</webHttpBinding>
<customBinding>
<binding name="httpStreaming" sendTimeout="Infinite">
<binaryMessageEncoding/>
<httpTransporttransferMode="Streamed" />
</binding>
</customBinding>
<bindings><behaviors><serviceBehaviors><behavior name="MyServiceBehavior"><serviceThrottlingmaxConcurrentCalls="1500" maxConcurrentInstances="1500" maxConcurrentSessions="1500" /> </behavior></serviceBehaviors></behaviors>
app/web.configapp/web.config
Consuming code
19
WSDL & Metadata -Problems
Some non-WCF consumers cannot understand the WSDL WCF produces
My WSDL contains the wrong host name
I cannot use multiple IIS web site bindings with my WCF services

20
WSDL & Metadata –Solutions I
Use custom extension to flatten WSDL into one file
need to use same namespace values forServiceContract, ServiceBehavior, BindingNamespace
eliminates wsdl:importand xsd:import
Register hostheadersin IIS toreflectnamesintoWSDL
forHTTP andHTTPS
Specifydifferent URIs forlisteningandexposingin WSDL

<endpointaddress="https://www.tt.com/TheUriIWantInWSDL" listenUri="http://localhost/TheActualUriServiceListensToOnThisBox" ...>
Considerexposinga staticWSDL whichdocumentsyourpublishedinterfaceversion

21
WSDL & Metadata –Solutions II
Multiple IIS site bindings result in multiple base addresses
WCF only supports a single base address in this scenario
fix yourself in .NET 3.0 with custom ServiceHostFactory
.NET 3.5 supports <baseAddressPrefixFilters>
pass-through filter which provides a mechanism to pick the appropriate IIS bindings
22
WSDL & Metadata -Samples<bindings><binding protocol="http”bindingInformation="*:80:www.thinktecture.com" /><binding protocol="https" bindingInformation="*:443:www.thinktecture.com" /></bindings>
<serviceHostingEnvironment>
<baseAddressPrefixFilters>
<add prefix="http://thinktecture.de/"/>
<add prefix="http://thinktecture.com"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
<%@ ServiceHostLanguage= "C#" Service="ProductCatalog" Factory="Thinktecture.ServiceModel.Activation.FlatWsdlServiceHostFactory" %>
.svc fileapp/web config
applicationHost.config(IIS7)
23
Large Data -Problems
Myserviceeatsa lotofmemoryandchokestheCPU whensending/receivinglarge data
Biggermessagesaremakingmycommunicationreallyslow
I havearbitrary, non-structureddatatotransfer

24
Large Data –Solutions I
WCF supportsMTOM forencodingbinarydata
MTOM especiallyusefulforinterop
ChunkingchannelsavailableasSDK & communitysamples
enablessendingchunksofdatainsteadofonesinglepiece
transparentlyworkswithdifferent transportsasa bindingelement
25
Large Data –Solutions II
Considerusingstreamingfortransferingabitrarydata
requirescertaincontractshape
Stream
Message
Streamassinglebodyin MessageContract
worksoveranytransportbesidesMSMQ
workswithtransportandmixed-modesecurity
still watchout forquotas
powerful withweb programmingmodel
26
Large Data -Samples
[ServiceContract]
public interface IVideoPlayer
{
[OperationContract]
[WebGet(UriTemplate= "videos/{videoID}")]
[WebContentType(MimeType= "video/x-ms-wmv")]
StreamPlay(string videoID);
}WebServiceHostwebHost= new WebServiceHost(typeof(VideoPlayerService));WebHttpBindingbinding = new WebHttpBinding();binding.TransferMode= TransferMode.Streamed;webHost.AddServiceEndpoint(typeof(IVideoPlayer),binding,"http://localhost:7777/Services/player");
Service contract
HostClient
27
Performance/Throughput-Problems
SomehowmyentireWCF-basedapplicationis‚slow‘
Hosting myWCF servicein IIS seemsnot toperformwell underhighload
I cannotseemtogeta highthroughputwhenclientstalk tomyservicevia HTTP
All thatdataisbeingtransferredagainandagain, itmakesmysystemslow
28
Performance/Throughput–Solutions
Configuring throttling can heal a lot (look there!)
.NET 3.5 SP1 provides asynchronous HTTP module & handler for hosting WCF in IIS for better behavior
Client-side HTTP communication is limited to 2 concurrent connections to a server
configurable through System.Net
Cache, cache, cache!
try to use caching intensively (but wisely) to save unnecessary round-trips
29
Performance/Throughput-Samples<system.net><connectionManagement><add address="*" maxconnection="20"/></connectionManagement></system.net>
public List<Episode> ListEpisodes()
{IDataCachecache = DataCacheFactory.CreateInstance();
List<Episode> episodes = cache.Get<List<Episode>>(CacheConstants.AllEpisodes);
if (episodes == null)
{
varepisodeList= mediaLogic.ListAllEpisodes();
episodes = EpisodeDataMapper.MapAllEpisodes(episodeList);
cache.Add(CacheConstants.AllEpisodes, episodes);
}


return episodes;
}
public interface IDataCache
{


void Add(string key, object cacheItem);
TCacheItemGet<TCacheItem>(string key);
void Remove(string key);


}
app/web.configE.g. service facade
Caching lib
30


Performance/Throughput–Cache Solution
Cache shouldbeabstractedfromactualcacheproduct/implementation
Genericinterfacewithdifferent implementations
local, in-proccache
distributedcache
ASP.NET‘sweb cachecanalso beusedoutside ofASP.NET
Distributed cachesnecessaryforfarmandscale-out scenarios
MemcacheD
SharedCache
‚Velocity‘
31
Special Case: Tracing
Useit!Itcansave your… J
Ifthingsgowrongandyouhavenocluewhy: trace!
But do not overuseitwhenin production
wrongusagecanmeansevereoverhead
Configuredvia configfile
canbemanipulatedvia code, but onlythroughWMI
DidI alreadysaytracingcansave your…?
32
Tracing-Sample<system.diagnostics><sources><sourcename="System.ServiceModel" switchValue="Warning" propagateActivity="true"><listeners><addtype="System.Diagnostics.DefaultTraceListener" name="Default" /><addname="ServiceModelTraceListener" /></listeners></source></sources><sharedListeners><addinitializeData=„MyService_Trace.svclog"type="System.Diagnostics.XmlWriterTraceListener, …"name="ServiceModelTraceListener" traceOutputOptions="Timestamp" /></sharedListeners><traceautoflush="true" /></system.diagnostics>
$ms= get-wmiobject-class "AppDomainInfo" -namespace "root\servicemodel" -computername"." | where{$_.Name -eq"MyWCFHost.exe"}
$ms.TraceLevel= "Warning, ActivityTracing"
$ms.Put()
<system.serviceModel>
<diagnosticswmiProviderEnabled="true"/>
app/web.configPS script
app/web.config
33
Resources
Avoiding problems with the using statement
http://msdn.microsoft.com/en-us/library/aa355056.aspx
Custom encoders
http://msdn.microsoft.com/en-us/library/ms751486.aspx
http://blogs.msdn.com/drnick/archive/2006/05/16/598420.aspx
Tracing
http://msdn2.microsoft.com/en-us/library/ms732023.aspx
http://msdn2.microsoft.com/en-us/library/aa751795.aspx
http://msdn2.microsoft.com/en-us/library/ms733025.aspx
http://msdn2.microsoft.com/en-us/library/aa751917.aspx
34
Resources
Setting upIIS SSL hostheaders
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/596b9108-b1a7-494d-885d-f8941b07554c.mspx
http://blogs.iis.net/thomad/archive/2008/01/25/ssl-certificates-on-sites-with-host-headers.aspx
baseAddressPrefixFilter
http://msdn.microsoft.com/en-us/library/bb924492.aspx
Chunkingchannel
http://code.msdn.microsoft.com/WCFResources/Release/ProjectReleases.aspx?ReleaseId=1546
35
Resources
AsynchronousWCF HTTP Module/Handler forIIS7 forBetterServer Scalability
http://blogs.msdn.com/wenlong/archive/2008/08/13/orcas-sp1-improvement-asynchronous-wcf-http-module-handler-for-iis7-for-better-server-scalability.aspx
WCF bindings& more
http://www.noemax.com
36
Resources
We have code solutions for some WCF problems, for free of course
Thinktecture.ServiceModel
èEmail Christian Weyer
christian.weyer@thinktecture.com
Weblog Christian Weyer
http://blogs.thinktecture.com/cweyer
thinktecture
http://www.thinktecture.com

37
http://www.thinktecture.com/
christian.weyer@thinktecture.com
http://blogs.thinktecture.com/cweyer/


In-depth support and consulting for software architects and developers
{ } 38

No comments:

Post a Comment

Angular Tutorial (Update to Angular 7)

As Angular 7 has just been released a few days ago. This tutorial is updated to show you how to create an Angular 7 project and the new fe...