Breaking Changes between Jan CTP and Feb CTP
Queue Changes in System.ServiceModel
PeerChannel changes in System.ServiceModel
Security changes in System.ServiceModel
System.ServiceModel.Description
System.ServiceModel.MsmqIntegration
System.ServiceModel.Activation
System.ServiceModel.Activation.Configuration
System.ServiceModel.Security.Tokens
System.ServiceModel. ComIntegration
This document describes the breaking changes between the WCF Jan CTP and the Feb CTP. C# code examples are provided in some sections. Some of the changes involve multiple namespaces so the document is layed out by feature area, then by namespace. The ServiceModel namespaces are presented first, followed by Hosting and Activation, Serialization, Security, Transactions, and COM integration. The most popular changes you’ll encounter in vanilla services are listed at the beginning of this document along with a summary of assembly and namespace changes. The changes in this list are primarily motivated by improving OM usability. Several changes have been made to facilitate industry interop. And several have been made for security reasons.
Not all types involved in a change are mentioned here. For instance, some changes describe namespace refactoring. Types will not show up in this report that have just been moved to a different namespace. If you have Visual Studio, searching for moved types in the object browser is an easy way to find their new namespace. They will also show up as removed from their old namespace and added to their new namespace in the detailed api change reports which can be found here.
While the size of this document may give the impression of significant churn, the volume of changes is actually smaller than the volume of changes between Beta1 and the Nov CTP. The size of this document is mostly due to the amount of detail about the changes including sample before and after code where possible. Further, do not be misled by the timespan Jan – Feb. We’ve been working on these changes in parallel to the last few CTPs.
Looking forward, we have most of the changes we know of to date completed but we will continue to listen to customer feedback, and react to interop and security testing which could result in additional changes to the OM.
We hope you will find it useful in moving your existing WCF code to the Feb CTP
Service configuration has changed:
has changed to .
Before
|
After
|
The format for the .svc files has changed:
Code Before <%@Service language=c# Debug="true" class="Microsoft.ServiceModel.Samples.CalculatorService" %> |
Code After <%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService" %> |
Your best bet to update client code is to rerun svcutil.
Removed
System.ServiceModel.Design
Added
System.ServiceModel.Dispatcher
System.ServiceModel.Description
System.ServiceModel.MsmqIntegration
Changed
Microsoft.Indigo.IndigoListener -> System.ServiceModel.Activation
System.ServiceModel.Integration -> System.ServiceModel.ComIntegration
Removed
System.Security.Authorization.dll
Added
System.IdentityModel.dll
The assembly reference location changed from %SystemRoot%\Microsoft.Net\Framework\v2.0.50727
to
%ProgramFiles%\Reference Assemblies\Microsoft\WinFX\v3.0
Change |
Reorganize WCF Namespace |
Description |
1) System.ServiceModel.Design has been removed. 2) Added System.ServiceModel.Dispatcher namespace. 3) Added System.ServiceModel.Description namespace 4) System.ServiceModel namespace 5) System.ServiceModel.Channels namespace now has most of the classes removed from Design namespace How you should think about the namespaces: |
Change |
ServiceModel Runtime API Cleanup |
Description |
- Rename DispatchBehavior -> DispatchRuntime - Remove DispatchBehavior.CorrelateReplies - Rename DispatchBehavior.DebugExceptionsOnClient -> DispatchBehavior.ReturnUnknownExceptionsAsFaults - Rename DispatchBehavior.DuplexCallbackBehavior -> DispatchBehavior.CallbackClientRuntime - Rename DispatchBehavior.ImpersonateCallerForAllServiceOperations -> DispatchBehavior.ImpersonateCallerForAllOperations - Add ChannelFaulted method to InputSessionShutdownHandlers - Rename DispatchBehavior.InstanceMode -> DispatchBehavior.InstanceContextMode - Rename Dispatcher.Behavior -> Dispatcher.Runtime - Rename Dispatcher.Filter -> Dispatcher.ContractFilter - Rename IEndpointDispatcher.Filter -> IEndpointDispatcher.ContractFilter - Change IEndpointDispatcher.SupportedChannels to Collection - Rename IProxyFormatter -> IClientFormatter - Rename IProxyMessageInspector -> IClientMessageInspector - Rename IProxyOperationSelector -> IClientOperationSelector - Rename ISharedSessionLifetime -> ISharableInstanceContextLifetime - ISharableInstanceContextLifetime.IsIdle should be a method takes an InstanceContext - Rename IStubFormatter -> IDispatchFormatter - Rename IStubMessageInspector -> IDispatchMessageInspector - Add OperationContext.ClientChannel (of type IClientChannel) - Remove OperationContext.ServiceThrottle - Rename OperationContext.SessionIdentifier -> OperationContext.SessionId - Rename ProxyBehavior -> ClientRuntime - Rename ProxyOperation -> ClientOperation - Rename ProxyBehavior.GetUnhandledProxyOperation to ClientRuntime.UnhandledClientOperation - Add ClientOperation.ReplyAction - ServerTooBusyException should derive from CommunicationException - Cut ServiceBehaviorAttribute.RunOnUIThread - Rename DispatchBehvaior.AuditLogLocation -> SecurityAuditLogLocation - Rename the parameter in ServiceHost constructor from serviceInstance -> singletonInstance to track the ServiceHost.SingletonInstance property it initializes - Rename EmptyFaultException -> FaultException - Make FaultException - Add Namespace to [FaultContract], FaultDescription - Cut FaultReason(...) that take CultureInfo, XmlLang - Remove UnknownFaultException - Rename System.ServiceModel.Dispatcher -> EndpointDispatcher - Rename InstanceMode -> Dispatcher.InstanceContextMode - Have ChannelBase (and ChannelManagerBase) implement IDefaultCommunicationTimeouts - Make DispatchBehavior.UnhandledDispatchOperation and ProxyBehavior.GetUnhandledProxyOperation() Unhandled*Operation properties - Add bool IsIdle to IShareableInstanceContextLifetime - Add an event to OperationContext to fire when the operation is completed - Throw if instance is provided for non-InstanceContextMode.Single service - Remove NodeQuotaExceededException. Rename and reparent subclasses: - Collapse EmptyFaultException and FaultException Together - Add (bool IsMulticast {get;}) to IBindingCapabilities - Remove MaxPendingOperations - Remove Support for Implementing IErrorHandler on the Service Type - Make DispatchBehavior.IgnoreContextFlowProperty public - Versioning: Change IMessageHeaderInfo to abstract class MessageHeaderInfo, and chang IEndpointDispatcher to abstract class EndpointDispatcherBase - Remove Deprecated Dispatcher / Proxy OM (DispatchBehavior.CorrelateReplies, ProxyOperation.SetThreadPrincipal) - Allow users to set DispatchOperationRuntime.IsOneWay - Add ValidateMustUnderstand to DispatchRuntime (was DispatchBehavior - Make ProxyOperation.ReplyAction Public - Rename ISharedSessionLifetime --> IShareableInstanceContextLifetime - Rename Dispatcher.Filter --> DispatchBehavior.ContractFilter (for custom IOperationSelector extensibility points and consistency) - Add overloads to IInstanceProvider.GetInstance and InstanceContext.GetServiceInstance that do not take a message. The existing overloads will not throw if message is null. |
Change |
Binding API cleanup |
Description |
- Rename SoapVersion -> EnvelopeVersion - Rename TransferDirection -> MessageDirection and .Incoming and .Outgoing to .Input and .Output - Rename ContractDescription.UsesSession to Session - Remove the OnXXX methods and the constructor that takes a config name from Binding - Remove IMessageEncodingBindingElement. MessageEncodingBindingElement will be an abstract base class with protected constructors that serves as the “common interface” for all encoders. - Remove MessageEncodingSection - On Binding/BindingElement/ChannelBuildContext: Rename the “CanBuildXXX” methods to “IsSupportedXXXType” - On Binding/BindingElement/ChannelBuildContext: Overload methods that take a BindingParameterCollection to also take a params array of objects. - Remove BindingReceivePreference and the properties that expose it. Add a knob to ServiceBehaviorAttribute to force all of a service’s endpoints to receive synchronously - BindingElement: Rename ChannelBuildContext to BindingContext - BindingElement: Add a GetInnerProperty - BindingElement: Add a GetProperty - Binding: Add a GetProperty - BindingElement: Remove ChannelProtectionRequirements |
Change |
Changes to ServiceContract inheritance rules |
Type of Origin |
System.ServiceModel.ServiceContract |
Description |
We made two changes to the way contract inheritance between ServiceContracts is handled. |
This change effects |
OM, Wire |
Change |
ServiceHost and ChannelFactory API cleanups |
Description |
- Removed all constructors in ChannelFactory - Removed ServiceHost.OnInitialize - Renamed ChannelFactory.GetProperty - Renamed IDuplexContextChannelInputInstance to IDuplexContextChannel.CallbackInstance - Renamed parameter ‘addressUri’ in ServiceHost.AddServicePoint to ‘address’ - Moved all constructors that take InstanceContext object from ClientBase - Renamed ServiceHost.ReflectedContracts to ServiceHost.ImplementedContracts - Renamed ServiceHost.OnCreateListener to OnBuildRuntime |
Change |
Endpoint runtime object refactoring |
Description |
- Refactor Dispatcher, IEndpointDispatcher, EndpointListener and InstanceListener into ChannelDispatcherBase, ChannelDispatcher and EndpointDispatcher - Add ListenUri and ListenUriMode to ServiceEndpoint - ListenUriBehavior (and corresponding config) are cut - Refactor behavior application to include AddBindingBehaviors |
This change effects |
OM, Config |
Change |
Merge Validators into Behaviors and clean up existing Validators |
Description |
- Refactor IBindingCapabilities into two interfaces, and rename the properties: - Rename BindingRequirementsAttribute --> DeliveryRequirementsAttribute - Rename/change the mechanism used to specify that a requirement on a service only applies to a particular contract type: - Remove the marker interface IValidator, and instead add a Validate() method to each behavior type. |
Change |
Remove Support for Implementing IErrorHandler on the Service Type |
Description |
In the past, if a service class implements IErrorHandler, we will automatically call it to process errors if an instance is handy. We've removed this feature. The supported way to supply an IErrorhandler for your class is now to use an IServiceBehavior to add an IErrorHandler to each ChannelDispather's ErrorHandlers collection. |
This change effects |
Behavior |
Change |
System.ServiceModel OM Cleanup |
Description |
Delete the following classes - public enum Transport - public enum CloseMode - public enum FlowOption - public enum UsageMode - public class MessageInterceptorEventArgs - public class ChannelBehaviorCollection - public class ContractBehaviorCollection - public class EndpointBehaviorCollection - public class OperationBehaviorCollection - public class ServiceBehaviorCollection - public class BindingParameterCollection - public class EndpointListenerReadOnlyCollection Mark the following classes internal - public class InstanceListenerCollection Change the namespace for the following classes: - From System.ServiceModel.Channels.TransferMode to System.ServiceModel.TransferMode - From System.ServiceModel.SynchronizedCollection - From System.ServiceModel.SynchronizedKeyedCollection - From System.ServiceModel.SynchronizedReadOnlyCollection - From System.ServiceModel.BehaviorCollection Private interface implementations - AspNetIntegrationRequirementsAttribute: IServiceBehavior - ServiceCredentials: IServiceBehavior - ListenUriBehavior: IEndpointBehavior - MatchAllEndpointBehavior: IEndpointBehavior - BinaryMessageEncodingBindingElement: IWsdlExporter - MtomMessageEncodingBindingElement: IWsdlExporter - TextMessageEncodingBindingElement: IWsdlExporter - TransportBindingElement: IWsdlExporter - ReliableSessionBindingElement: IPolicyExporter - TransactionFlowBindingElement: IPolicyExporter - MessageEncodingBindingElementConverter: IWsdlImporter, IPolicyImporter - TransportBindingElementConverter: IWsdlImporter, IPolicyImporter - ReliableSessionBindingElementConverter: IPolicyImporter - SecurityBindingElementConverter: IPolicyImporter - TransactionFlowBindingElementConverter: IPolicyImporter - Message: IDisposable - CommunicationObject: IDisposable Generic parameter naming - IFilterTable - ActionFilterTable - EndpointAddressFilterTable - EndpointFilterTable - FilterTable - XPathFilterTable - FaultException - StandardBindingsSection - ServiceModelBasicMapConfigurationElementCollection - ServiceModelExtensionSectionCollection - StandardBindingConfigurationElementCollection - StandardBindingSection List - Remove SynchronizedReadOnlyCollection.ctor(object syncRoot, List - Remove SynchronizedCollection.ctor(object syncRoot, List Tree State Enums - Change BindingRequirementsMode(Ignore, Require, Disallow) to QueuedDeliveryRequirementsMode(NotAllowed, Allowed, Required) |
Change |
FaultContractAttribute is now restricted to methods |
Type of Origin |
System.ServiceModel.FaultContractAttribute |
Description |
We no longer allow the [FaultContract] attribute to appear on classes or interfaces. Using [FaultContract] on individual operations is now the only supported use. |
This change effects |
OM |
Change |
Re-purpose the Reentrant ConcurrencyMode |
Type of Origin |
System.ServiceModel.ConcurrencyMode |
Description |
In the Jan CTP we locked the InstanceContext when a call to a service is made and don’t release the lock till that call is serviced. To support reentrant we will release the lock on the instance when we are making a call out from the service. When the service gets a response for that outbound call, it will reacquire the lock. This is a logical change and has no public OM change. |
This change effects |
Behavior |
Change |
Refined manual flow control API |
Description |
Remove ManualFlowControlEnabled and ManualFlowControlLimit from ServiceThrottle. Remove ServiceThrottle from OperationContext. Remove InstanceContextThrottle class, and InstanceContext’s Throttle property of that type. Add int ManualFlowControlLimit {get;set;} to ServiceHost and InstanceContext. This property defaults to Int32.MaxValue. When set to Int32.MaxValue, the limit is disabled. When set to 0, no more messages are allowed to flow. This throws if you set it to a negative number. Add int IncrementManualFlowControlLimit(int incrementBy) to ServiceHost and InstanceContext. This method atomically increments ManualFlowControlLimit by the specified amount. The return value provides the new limit. This method throws if incrementBy is not positive, or if the result overflows Int32.MaxValue. |
This change effects |
OM |
Before public sealed class ServiceThrottle public sealed class InstanceContext : |
|
After public sealed class InstanceContext : |
Change |
ServiceModel OM cleanup: Addressing, Filtering, Message |
Description |
bool GetMatchingFilter(Message message, |
This change effects |
OM, Config |
Change |
Remove MessageContractAttribute.Action (and Rely Upon OperationContractAttribute.Action / OperationContractAttribute.ReplyAction) |
Type of Origin |
System.ServiceModel.MessageContractAttribute |
This change effects |
OM |
Before |
MessageContract.Action was used if present |
After |
The OperationContractAttribute should now be used to control the Action |
Code Before [MessageContract(Action="Foo")] [MessageContract(Action="Bar")] [ServiceContract] |
|
Code After [MessageContract] public class MyMessage1{} [MessageContract] public class MyMessage2{} [ServiceContract] public class MyContract { |
Change |
TypedMessageConverter is no longer generic |
Type of Origin |
System.ServiceModel.TypedMessageConverter |
This change effects |
OM |
Code Before //Only one overload shown below Message ms = TypedMessageConverter.ToMessage(m); |
|
Code After //Only one overload shown below: MyMsgContr m = (MyMsgContr)tmc.FromMessage(myMessage); |
Change |
WS-Addressing CR |
Description |
For EndpointAddress, the major changes are: |
This change effects |
OM, Wire |
After public sealed class AddressingVersion |
|
Code Before [ServiceContract] |
|
Code After [ServiceContract] |
Change |
Removed message size quota on sending |
Description |
MaxMessageSize applied to both sent and received messages. This change removes this quota on sent messages. The quota now applies only to received messages (whether received by a service or by a client) and therefore the property and configuration attribute are renamed MaxReceivedMessageSize. |
Type of Origin |
System.ServiceModel.TransportBindingElement |
This change effects |
OM, Config |
Before |
MaxMessageSize |
After |
MaxReceivedMessageSize |
Code Before TransportBindingElement be; |
|
Code After TransportBindingElement be; |
Change |
Replaced ITransportBindingElement with TransportBindingElement |
Description |
ITransportBindingElement was removed. The public abstract class TransportBindingElement was given a protected constructor (instead of the internal constructor it had) so that custom transport binding elements can derive from it. |
Type of Origin |
System.ServiceModel.ITransportBindingElement |
This change effects |
OM |
Code Before public class MyBindingElement : ITransportBindingElement |
|
Code After public class MyBindingElement : TransportBindingElement |
Change |
Make HostedBindingBehavior internal |
Description |
The removal of this type should not impact user code, as it had no public constructor. |
Type of Origin |
System.ServiceModel.HostedBindingBehavior |
This change effects |
OM |
Change |
Update addressing config OM (namechange only) |
Description |
Change several config type names to match their names in config including: |
Type of Origin |
System.ServiceModel config types |
This change effects |
OM |
Change |
Change Binding Extension Mechanism to \extensions\bindings\ |
Description |
This is not exactly a breaking change. Both config sections will work and have the same effect. The old way uses the System.Configuration extension point. The new way uses the System.ServiceModel extension point. |
Type of Origin |
System.ServiceModel.Extensions |
This change effects |
Config |
Before
|
|
After
|
Change |
Change in Dead Letter Queue OM |
Description |
We simplified the programming model for DLQ. |
Type of Origin |
System.ServiceModel.MsmqBindingElementBase, System.ServiceModel.MsmqBindingBase |
This change effects |
OM, Config |
Before public class MsmqBindingElementBase |
|
After public enum DeadLetterQueue { None, System, Custom }; |
|
Code Before NetMsmqBinding binding = new NetMsmqBinding(); |
|
Code After NetMsmqBinding binding = new NetMsmqBinding(); |
Change |
Sending SRMP messages in MSMQ |
Description |
We simplified how SRMP messages get sent over MSMQ using Queued Binding. User no longer is required to create a custom binding. |
Type of Origin |
System.ServiceModel, System.ServiceModel.MsmqBindingElementBase, System.ServiceModel.MsmqBindingBase |
This change effects |
OM, Config |
Before |
System.ServiceModel.SrmpBindingElement, System.ServiceModel.SrmpsBindingElement |
After |
1) dropped net.srmp and net.srmps schemes (2) dropped SrmpBindingElement and SrmpsBindingElement (3) introduced new enumeration in MsmqBindingElementBase QueueTransferProtocol { Native, Srmp, SrmpSecure } |
Code Before |
Creates a custom binding using Srmp(s) binding elements to send messages to the queue. |
Code After |
Chooses the enumeration settings in the standard binding. |
Change |
Different channelfactories at the same EPA with different MessageAuthentication settings for NetPeerTcpBinding. |
Description |
Different security settings at the same EndpointAddress on the same mesh is not allowed. However, applications can specify different message security requirements if at different EndpointAddresses. |
Type of Origin |
System.ServiceModel.NetPeerTcpBinding. |
This change effects |
Behavior |
Before |
different channelfactories at the same EPA with different MessageAuthentication settings was allowed. |
After |
different channelfactories at the same EPA with different MessageAuthentication settings throws exception. |
Code Before EndpointAddress epa = new EndpointAddress("net.p2p://foo/bar"); |
|
Code After EndpointAddress epa = new EndpointAddress("net.p2p://foo/bar"); |
Change |
Change the type of System.ServiceMode.NetPeerTcpBinding.ListenIPAddress property |
Type of Origin |
System.ServiceMode.NetPeerTcpBinding, System.ServiceMode.PeerTransportBindingElement |
This change effects |
OM |
Before |
ListenIPAddress property on System.ServiceMode.NetPeerTcpBinding and System.ServiceMode.PeerTransportBindingElement is typed as a string. |
After |
ListenIPAddress property on System.ServiceMode.NetPeerTcpBinding and System.ServiceMode.PeerTransportBindingElement is now typed as IPAddress. |
Code Before NetPeerTcpBinding binding = new NetPeerTcpBinding(); |
|
Code After NetPeerTcpBinding binding = new NetPeerTcpBinding(); |
Change |
Public peerchannel classes in System.ServiceModel.Channels namespace moved to System.ServiceModel namespace |
Description |
user code needs to use appropriate using statements to gain visibility to the classes |
This change effects |
OM |
Before namespace System.ServiceModel namespace System.ServiceModel.Channels namespace System.ServiceModel.Configuration namespace System.ServiceModel.Design |
|
After namespace System.ServiceModel namespace System.ServiceModel.Security namespace System.ServiceModel.Configuration |
Change |
Add CustomResolver support |
This change effects |
OM, Config |
Before |
applications that want to implement a custom resolver needs implement a resolver service, and a client side proxy that implements PeerResolver abstract class. |
After |
For majority of custom resolver scenarios that do not require customization, applications can specify the details like Binding and Endpoint of the custom resolver service that implements IPeerResolverContract and PeerChannel uses a predefined proxy to communicate with the custom resolver. A default implementation of IPeerResolverContract is also provided which makes building custom resolver trivial. |
Code After //To use custom resolver support available in WCF, application' code: |
Change |
Refactor - PeerNode / PeerBehavior attribute to use IChannel.GetProperty |
Type of Origin |
System.ServiceMode.PeerBehaviorAttribute |
This change effects |
OM |
Before |
PeerBehaviorAttribute must be specified on the service contract inorder for applications to retrieve PeerNode instance. |
After |
With this change, A PeerBehaviorAttribute need not be specified on the application contracts. Applications can simply use channel.GetProperty |
Code Before [Peer] |
|
Code After public interface IFoo{} |
Change |
PeerChannel's security model OM changed to conform to WCF’s OM as much as possible |
Type of Origin |
System.ServiceModel.NetPeerTcpBinding, System.ServiceModel.PeerTransportBindingElement, |
This change effects |
OM, Config |
Before |
NetPeerTcpBinding and PeerTransportBindingElement have separate properties to configure security. MessageAuthentication and PeerNodeAuthenticationMode. |
After |
NetPeerTcpBinding and PeerTransportBindingElement have Security property to configure both transport and message security. |
Code Before NetPeerTcpBinding binding = new NetPeerTcpBinding(); |
|
Code After NetPeerTcpBinding binding = new NetPeerTcpBinding(); |
Change |
Service Model Security Changes |
Description |
There are 32 static factory methods matching the Create*Binding naming pattern on the SecurityBindinigElement class. The change is to rename all of them to match Create*BindingElement naming pattern. |
Type of Origin |
System.ServiceModel.Channels.SecurityBindingElement |
This change effects |
OM |
Change |
Remove DefaultProtectionLevel from binding and add ProtectionLevel property to ServiceContract, OperationContract, MessageContract and FaultContract |
Description |
API |
This change effects |
OM, Config |
Code Before
|
|
Code After // defaultProtectionLevel is removed from configuration. |
Change |
Change secure conversation bootstrap configuration for custom bindings and add a switch to turn secure conversation on/off on WsHttpBinding |
Type of Origin |
System.ServiceModel.SecurityBindingElement |
This change effects |
OM, Config |
Before public abstract class System.ServiceModel.SecurityBindingElement { |
|
After public abstract class System.ServiceModel.SecurityBindingElement { |
|
Code Before
|
|
Code After
|
Change |
Remove ServiceAuthorization class |
Description |
The ServiceAuthorization class has been removed as the functionality it provided is contained within ServiceAuthorizationBehavior |
Type of Origin |
System.ServiceModel.ServiceHostBase |
This change effects |
OM |
Before public abstract class ServiceHostBase |
|
After public abstract class ServiceHostBase |
|
Code Before void Func ( ServiceHost sh ) |
|
Code After void Func ( ServiceHost sh ) |
Change |
Refactor Authorization Framework |
This change effects |
OM, Config |
Before public sealed class ServiceAuthorizationBehavior : IServiceBehavior |
|
After public class ServiceAuthorizationBehavior |
|
Code Before
|
|
Code After
|
Change |
Changes to the TransactionFlowOption enumeration |
Type of Origin |
System.ServiceModel.TransactionFlowOption |
This change effects |
OM |
Before public enum TransactionFlowOption |
|
After public enum TransactionFlowOption |
Change |
Removed the TransactionProtocol enumeration |
Type of Origin |
System.ServiceModel.TransactionFlowOption |
This change effects |
OM |
Change |
Removed ITransactedTransportListenerFactory |
Type of Origin |
System.ServiceModel.ITransactedTransportListenerFactory |
This change effects |
OM |
Change |
Make TransactionProtocolHelper Internal |
Type of Origin |
System.ServiceModel.TransactionProtocolHelper |
This change effects |
OM |
Change |
Finish Cleaning-Up Channel Interfaces |
Description |
This change covers several individual cleanup items related to the channel interfaces. - A GetProperty - The overloads to IChannelFactory.CreateChannel that take a string and an Uri will be removed. - The InnerChannelFactory and InnerChannelListener properties on IChannelFactory and IChannelListener will be removed. - The ChannelListenerBase class has a virtual Accept method. To be consistent with the other channel framework base classes it should have a non-virtual Accept method that does the required state checking and then delegates to a virtual OnAccept method. This also applies to the asynchronous Accept methods. - The BuildChannelFactory and BuildChannelListener methods on the Binding class take a BindingParameterCollection. These require all callers of these methods to instantiate a collection and add the individual objects to the collection one by one. These methods will be change to take an extensible number of objects to remove the need to create a collection object. - The IChannelListener interface has various SetUri and SetUniqueUri methods. These setters must be called on the channel listener before it is opened. This is inconsistent with the rest of the channel framework, where properties are passed into the binding element and set when the channel listener is constructed. This inconsistency will be removed by adding overloads with extra parameters to the BuildChannelListener methods on the binding element and removing these methods from IChannelListener. - The GetChannels method on IChannelManager will be removed. - The Scheme property will be removed from IChannelManager. - The LayeredChannelFactory and LayeredChannelListener classes will be removed from the public OM. - The ChannelType property will be removed from the IChannelFactory and IChannelListener interfaces. |
This change effects |
OM, Wire |
Change |
Modify IChannelFactory to Take Generic Parameter |
Description |
Created an IChannelFactory |
This change effects |
OM |
After // |
Change |
Rename WsFederationBinding and MessageCredentialType.Infocard |
This change effects |
OM, Config |
Before public class WSFederationBinding : WSHttpBindingBase { } |
|
After public class WSFederationHttpBinding : WSHttpBindingBase { } |
|
Code Before WSFederationBinding b = new WSFederationBinding(); |
|
Code After WSFederationHttpBinding b = new WSFederationHttpBinding(); |
Change |
Simplify CompositeDuplex model |
Description |
The CompositeDuplex implementation was simplified to hand out separate input and output channels instead of using an IDuplexChannel. Changed CompositeDuplexBindingElement.BuildChannelFactory to support creating a IChannelFactory |
Type of Origin |
System.ServiceModel.Channels.CompositeDuplexBindingElement |
This change effects |
OM |
Change |
Change handling of empty bodies for HTTP channels in REST mode |
Description |
The channel previously converted received messages that lacked an entity body to null. In REST mode (when the mapping mode is HttpMappingMode.AnyXml), this scenario now results in an empty message (a message whose Message.IsEmpty returns true). |
Type of Origin |
System.ServiceModel.Channels.HttpChannelFactory |
This change effects |
Behavior |
Change |
Transport exception types and messages changed |
Description |
We have improved the exceptions thrown from transports to provide more information about the error. In some cases this required changes to the types of exceptions thrown. However in most cases it was only a change in the exception message. |
This change effects |
Behavior |
Change |
Removed transport-level one-way session support from TCP and Named Pipes |
Description |
One-way session support is no longer provided by TCP and Named Pipes. This means that code that used to ask for an IInputSessionChannel or an IOutputSessionChannel from either transports (by calling BuildChannelFactory |
This change effects |
Behavior |
Code Before //building an IInputSession Channel Factory with TCP |
|
Code After // build an IDuplexSessionChannel channel factory instead |
Change |
Remove manualAddressing property on PeerTransportBindingElement |
Description |
Removed the ManualAddressing property from peerchannel's binding element. We no longer support explicit user speficied addressing. |
Type of Origin |
System.ServiceModel.Channels.PeerTransportBindingElement |
This change effects |
OM, Config |
Change |
System.ServiceModel.Channels.DirectionalAction made internal |
Type of Origin |
System.ServiceModel.Channels.DirectionalAction |
This change effects |
OM |
Change |
Merge IChannelBehavior and IEndpointBehavior |
Type of Origin |
IChannelBehavior |
Description |
In the past, implementers would use IChannelBehavior for endpoint-scoped behaviors on the client side, and IEndpointBehavior for endpoint-scoped behaviors on the service. To simplify the model we've eliminated the IChannelBehavior and made IEndpointBehavior apply on the client-side. On the client side, we call the ApplyClientBehavior() method to execute your behavior; on the service side, we call ApplyDispatchBehavior(). |
This change effects |
OM |
Change |
Metadata OM cleanup |
Description |
We made various cleanups to the metadata related APIs. |
This change effects |
OM |
Before System.ServiceModel.ServiceContractGenerator { |
|
After System.ServiceModel.Description.ServiceContractGenerator { |
Change |
New model for adding metadata endpoints |
Description |
We have removed support for the verbs defined in WS-Metadata Exchange (Get, GetMetadata) and we are instead using WS-Transfer for retrieving metadata using SOAP. To explicitly add metadata endpoints in config you should now add your metadata endpoints using the metadataExchangeEndpoints configuration section inside of the metadataPublishing behavior configuration section. |
This change effects |
OM, Config, Wire |
Before System.ServiceModel.GetMetadataRequest |
|
After System.ServiceModel.Configuration.MetadataExchangeEndpointElement System.ServiceModel.Description.ServiceMetadataBehaivor { |
Change |
MetadataResolver functionality split into multiple types |
Description |
The functionality in the original System.ServiceModel.Design. MetadataResolver has been moved to two types: System.ServiceModel.Description.MetadataTransferClient and System.ServiceModel.Description.MetadataResolver. The MetadataTransferClient is an implementation of WS-MetadataExchange and uses WS-Transfer as the retrieval verb. The new MetadataResolver is a helper type that uses the MetadataTransferClient and the WsdlImporter to retrieve and import metadata as endpoints. Neither the MetadataResolver nor the MetadataTransferClient support the DISCO protocol. To retrieve metadata using DISCO use the System.Web.Services.Protocols.DiscoveryClientProtocol type. |
Type of Origin |
System.ServiceModel.Design.MetadataResolver |
This change effects |
OM, Wire |
Code Before MetadataResolver resolver = new MetadataResolver(address); |
|
Code After ServiceEndpointCollection endpoints = MetadataResolver.Resolve(address); |
Change |
MetadataBundle is now MetadataSet |
Description |
The MetadataBundle has been replaced with the MetadataSet type. A MetadataSet is a representation of the metadata format defined in the WS-Metadata Exchange protocol. |
Type of Origin |
System.ServiceModel.MetadataBundle |
This change effects |
OM |
Change |
Namespace Added: System.ServiceModel.MsmqIntegration |
This change effects |
OM |
Before System.ServiceModel |
|
After System.ServiceModel.MsmqIntegration |
|
Code Before using System.ServiceModel; |
|
Code After using System.ServiceModel; |
Change |
Removed dependencies on the WCF typed programming model in hosting code and in the WCF configuration model |
Description |
We have reworked the SerivceHost and ServiceHostBase types so that the WCF programming model and configuration model can be reused or replaced. ServiceHostBase now supports building a runtime from a ServiceDescription and provides overloads for constructing a ServiceDescription using the WCF programming model and configuration model. The WCF configuration model is no longer strongly tied to the WCF programming model. Names in config are now strictly treated as configuration strings and not necessarily as types. When using the WCF programming model the configuration names should be the full type names. Assembly qualified type names are no longer supported. |
This change effects |
OM, Config |
Code Before
|
|
Code After
|
Change |
Changes to Listener configuration schema |
Type of Origin |
NA |
This change effects |
Config |
After
|
Change |
Changes to Listener service names |
Type of Origin |
NA |
This change effects |
Windows Service Names |
Before |
itcppss (Indigo TCP Port Sharing Service) |
After |
NetTcpPortSharing (Net.Tcp Port Sharing Service) |
Change |
Change MSMQ activation service to run with Network Service identity |
Description |
This is not a breaking change. We now enable MSMQ activation service to run with NETWORK SERVICE identity. As such, this would allow us to activate from remote queues. Before this change, the user has to explicitly configure a particular identity to activate from remote queues. |
This change effects |
Security model -on how MSMQ activation service can activate from remote queues |
Change |
Namespace update - Microsoft.Indigo.IndigoListener -> System.ServiceModel.Activation |
Type of Origin |
Microsoft.Indigo.IndigoListener |
This change effects |
OM |
Code Before using Microsoft.Indigo.IndigoListener; |
|
Code After using System.ServiceModel.Activation; |
Change |
Type Name Update - IndigoListenerSectionGroup -> ServiceModelActivationSectionGroup |
Type of Origin |
IndigoListenerSectionGroup |
This change effects |
OM |
Code Before string smSvcHostInstallPath = System.IO.Directory.GetParent( |
|
Code After string smSvcHostInstallPath = System.IO.Directory.GetParent( |
Change |
Hide the XmlC14NWriter |
Description |
The XmlC14NWriter is no longer a part of our public OM. |
Type of Origin |
System.Xml.XmlC14NWriter |
This change effects |
OM |
Before StartCanonicalization(XmlC14NWriter writer) |
|
After StartCanonicalization(Stream stream, bool includeComments, |
Change |
Serialization OM refactoring |
Description |
Change 4: See Before and after for changes 1 – 3 |
This change effects |
OM, Config |
Before //Change 1 |
|
After //Change 1 |
Change |
EnumMemberAttribute now controls enum serialization |
Description |
Instead of using the DataMemberAttribute to control enum serialization, the EnumMemberAttribute now has to be used. |
This change effects |
OM |
Change |
KnownType splits into ServiceKnownType and KnownType (and config changes) |
Description |
Before, the KnownTypeAttribute was used for Data, Service and Operation contracts. Now, the ServiceKnownTypeAttribute has to be used on Service and Operation contracts, while the KnownTypeAttribute should still be used on Data contracts. We will disallow the usage of KnownTypeAttribute on interfaces and methods. Finally, we will remove the MaxItemsInObjectGraph and MaxTypes quotas from System.Runtime.Serialization config section (unrelated to the KnownType change) |
Type of Origin |
System.Runtime.Serialization.KnownTypeAttribute |
This change effects |
OM, Config |
Change |
Security OM Cleanup |
Description |
1. Internalize Identity.ReadIdentity method |
This change effects |
OM, Config |
Change |
Remove ProtectTokens property from AsymmetricSecurityBindingElement and SymmetricSecurityBindingElement |
Description |
API |
Type of Origin |
System.ServiceModel.Security.AsymmetricSecurityBindingElement |
This change effects |
OM, Config |
Change |
IdentityVerifier extensibility |
Type of Origin |
System.ServiceModel.Security.IdentityVerifier |
This change effects |
OM |
Before public class IdentityVerifier |
|
After public abstract class IdentityVerifier |
Change |
Change SecurityVersion to be like MessageVersion for better versionability |
Description |
The System.ServiceModel.Security.SecurityStandardsManager was replaced by a combination of System.ServiceModel.Security.MessageSecurityVersion and System.IdentityModel.Selectors.SecurityTokenVersion. In addition we moved serialization related methods from System.ServiceModel.Security.SecurityStandardsManager to System.IdentityModel.Selectors.SecurityTokenSerializer. |
Type of Origin |
System.ServiceModel.Security.SecurityVersion |
This change effects |
OM, Config |
Before public enum System.ServiceModel.Security.SecurityVersion |
|
After public abstract class System.ServiceModel.Security.SecurityVersion |
Change |
Specifying Optional Claims for Issued Tokens |
Type of Origin |
System.ServiceModel.Security.Tokens.IssuedSecurityTokenParameters |
This change effects |
OM, Config |
Before public class IssuedSecurityTokenParameters : SecurityTokenParameters |
|
After public class ClaimTypeRequirement |
|
Code Before WSFederationBinding binding = |
|
Code After WSFederationBinding binding = |
Change |
Namespace Refactoring and Removal of Redundant Classes |
Description |
Classes from System.Security.Authorization.dll and System.ServiceModel.dll relating to tokens and authorization were moved into a new assembly; System.IdentityModel.dll as detailed below; |
This change effects |
OM |
Code Before using System.Security.Authorization; |
|
Code After using System.IdentityModel.Policy |
Change |
Refactor Token and Credential Frameworks |
This change effects |
OM, Config |
Before public abstract class SecurityToken |
|
After public abstract class SecurityToken |
|
Code Before
|
|
Code After
|
Change |
SAML Cleanup |
Description |
Users of SamlAttribute would previously have had to deconstruct their Claim object in order to pass the constituent parts to the 3 argument constructor. They can now just pass the Claim object directly to the new constructor. |
This change effects |
OM |
Before class SamlSubjectStatement |
|
After class SamlSubjectStatement |
Change |
Remove .NET-AT protocol from WCF V1 |
Description |
The .NET-AT protocol will not be included in WCF |
Type of Origin |
N/A |
This change effects |
OM, Config, Wire |
Change |
Rename AppendOptions to RecordAppendOptions |
Type of Origin |
System.IO.Log.AppendOptions |
This change effects |
OM |
Before |
System.IO.Log.AppendOptions |
After |
System.IO.Log.RecordAppendOptions |
Change |
WS-AT registry key location updated |
Description |
This change introduces a degree of versioning support to the registry configuration settings |
Before |
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\WSAT |
After |
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\WSAT\3.0 |
Change |
Namespace Update - System.ServiceModel.Integration -> System.ServiceModel.ComIntegration |
Type of Origin |
System.ServiceModel.Integration |
This change effects |
OM |
Code Before using System.ServiceModel.Integration; |
|
Code After using System.ServiceModel.ComIntegration; |
Change |
Removed COM+ surrogates extensibility point |
Description |
The surrogate class required to use this extensibility point can be modified to directly call the underlying COM+ components. This extensibility layer proivided little additional benefit. |
Type of Origin |
System.ServiceModel.Integration.IServiceSurrogate |
This change effects |
Config |
Change |
Svcutil no longer supports /compile |
Description |
Svcutil no longer supports the /compile option. Instead you should generate code and compile it using the appropriate compiler. |
This change effects |
Command-line tool option |
Change |
Svcutil no longer supports generating code in JScript.NET |
Description |
Using Svcutil.exe to generate JScript.NET code is no longer supported. |
This change effects |
Code generation |
Change |
Svcutil generates standard bindings in config instead of custom bindings |
Description |
Previously, bindings imported from metadata would always be imported as custom bindings, even if standard bindings were used on the service. If imported bindings now match a standard binding, they will be imported as a standard binding. |
Type of Origin |
System.ServiceModel.Design.WsdlImporter |
This change effects |
Config |
Change |
Svcutil will now replicate the session attribute settings in generated clients |
Description |
Previously, if you implemented a service contract with the session attribute set to true, a generated proxy would not have this attribute reflected in its contract. We now project the server session setting into metadata so that it can be reflected in generated clients. |
Type of Origin |
System.ServiceModel.Design.WsdlImporter |
This change effects |
Wire, Generated code |