Download this document

 

Breaking Changes between Jan CTP and Feb CTP. 1

Popular Changes. 2

Namespace changes. 3

Assembly changes. 3

ServiceModel 4

System.ServiceModel 10

Queue Changes in System.ServiceModel 25

PeerChannel changes in System.ServiceModel 26

Security changes in System.ServiceModel 32

System.ServiceModel.Channels. 46

System.ServiceModel.Description. 54

System.ServiceModel.MsmqIntegration. 57

Hosting and Activation. 57

System.ServiceModel.Activation. 60

System.ServiceModel.Activation.Configuration. 60

Serialization. 61

System.Runtime.Serialization. 62

Security. 64

System.ServiceModel.Security. 65

System.ServiceModel.Security.Tokens. 68

System.IdentityModel 70

System.IdentityModel.Tokens. 73

Transactions. 85

System.IO.Log. 85

COM Integration. 85

System.ServiceModel. ComIntegration. 85

SvcUtil 86

Breaking Changes between Jan CTP and Feb CTP

 

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

Popular Changes

Service configuration has changed:

has changed to .

Before


 
   
              type="Microsoft.ServiceModel.Samples.CalculatorService">
                  address=""
          binding="wsHttpBinding"
          contract="Microsoft.ServiceModel.Samples.ICalculator" />
     
   

 

After


 
   
              name="Microsoft.ServiceModel.Samples.CalculatorService">
                  address=""
          binding="wsHttpBinding"
          contract="Microsoft.ServiceModel.Samples.ICalculator" />
     
   

 

 

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.

Namespace changes

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

Assembly changes

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

ServiceModel

 

Change

Reorganize WCF Namespace

Description

1)       System.ServiceModel.Design has been removed.

2)        Added System.ServiceModel.Dispatcher namespace.
  o This will contain classes that are related to runtime and runtime extensibility interfaces
  o This also contains the filtering classes

3)        Added System.ServiceModel.Description namespace
  o This will now contain classes that describe services.
  o This will contain all the Behavior, Description and Metadata classes.

4)        System.ServiceModel namespace
  o This will contain classes dealing with ServiceHost, ChannelBase, ChannelFactory (Basic programming from user point of view)
  o All standard bindings that will be used 90% of the time by the users have been left in this namespace.

5)        System.ServiceModel.Channels namespace now has most of the classes removed from Design namespace
  o Going forward this will contain all the non standard binding classes. Standard binding classes should go to System.ServiceModel
  o It will also contain all the Channel, Message related classes and converter classes

How you should think about the namespaces:

Audience 1 (the Services users):
  o I want to write Services (include System.ServiceModel)
  o I want to configure Services imperatively (include System.ServiceModel.Description)
  o I want to add a little extension (include System.ServiceModel.Dispatcher)
  o I want to add a new aspect to the channel layer (include System.ServiceModel.Channels)
 
Audience 2 (the Sockets/System.Net/Wininet user):
  o I want to use Channels (include System.ServiceModel.Channels)
  o I want to add a new aspect to the channel layer (include System.ServiceModel.Channels)

 

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 : FaultException, which adds a T DetailType

-          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:
 NavigatorNodeQuotaExceededException -> XPathNavigatorException : XPathException
 FilterNodeQuotaExceededException -> MessageFilterException : CommunicationException

-          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 method to BindingElement that takes a context parameter

-          Binding: Add a GetProperty method

-          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.

First, if an interface decorated with [ServiceContract] inherited from another interface with [ServiceContract], an endpoint of the derived type would export WSDL that included special content indicating the inheritance relationship.  That content has been removed.

Second, we allow users to decorate classes with [ServiceContract] as a convenience when they don't want to use an interface.  Extending these [ServiceContract] classes with other classes that extend [ServiceContract] is no longer allowed.

This change effects

OM, Wire

 

Change

ServiceHost and ChannelFactory API cleanups

Description

-          Removed all constructors in ChannelFactory that take ‘Uri Via’ in their constructor. This also means that the GetUri method on ChannelFactory gets removed too.

-          Removed ServiceHost.OnInitialize

-          Renamed ChannelFactory.GetProperty to GetProperty

-          Renamed IDuplexContextChannelInputInstance to IDuplexContextChannel.CallbackInstance

-          Renamed parameter ‘addressUri’ in ServiceHost.AddServicePoint to ‘address’

-          Moved all constructors that take InstanceContext object from ClientBase to DuplexClientBase

-          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:
Becomes IBindingDeliveryCapabilities & IBindingMulticastCapabilities

-          Rename BindingRequirementsAttribute --> DeliveryRequirementsAttribute

-          Rename/change the mechanism used to specify that a requirement on a service only applies to a particular contract type:
bool IsApplicableToContract(Type contractType); --> Type TargetContract   { get; }

-          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

 

System.ServiceModel

 

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 to System.Collections.Generic.SynchronizedCollection

-          From System.ServiceModel.SynchronizedKeyedCollection to System.Collections.Generic.SynchronizedKeyedCollection

-          From System.ServiceModel.SynchronizedReadOnlyCollection to System.Collections.Generic.SynchronizedReadOnlyCollection

-          From System.ServiceModel.BehaviorCollection to System.Collections.Generic.KeyedByTypeCollection

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 to IFilterTable

-          ActionFilterTable to ActionFilterTable

-          EndpointAddressFilterTable to EndpointAddressFilterTable

-          EndpointFilterTable to EndpointFilterTable

-          FilterTable to FilterTable

-          XPathFilterTable to XPathFilterTable

-          FaultException to FaultException

-          StandardBindingsSection to StandardBidingsSection

-          ServiceModelBasicMapConfigurationElementCollection to ServiceModelBasicMapConfigurationElementCollection

-          ServiceModelExtensionSectionCollection to ServiceModelExtensionSectionCollection

-          StandardBindingConfigurationElementCollection to StandardBindingConfigurationElementCollection

-          StandardBindingSection to StandardBindingSection

List usage

-          Remove SynchronizedReadOnlyCollection.ctor(object syncRoot, List, bool makeCopy)

-          Remove SynchronizedCollection.ctor(object syncRoot, List, bool makeCopy)

 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 bool ManualFlowControlEnabled { get; set; }
    public int ManualFlowControlLimit { get; set; }
}

public sealed class OperationContext :
    IExtensibleObject
{
    public ServiceThrottle ServiceThrottle { get; }
}

public sealed class InstanceContextThrottle
{
    public bool ManualFlowControlEnabled { get; set; }
    public int ManualFlowControlLimit { get; set; }
}

public sealed class InstanceContext :
    CommunicationObject,
    IExtensibleObject
{
    public InstanceContextThrottle Throttle { get; }
}

After

public sealed class InstanceContext :
    CommunicationObject,
    IExtensibleObject
{
    public int ManualFlowControlLimit { get; set; }
    public int IncrementManualFlowControlLimit(
        int incrementBy);
}

public class ServiceHost : ServiceHostBase
{
    public int ManualFlowControlLimit { get; set; }
    public int IncrementManualFlowControlLimit(
        int incrementBy);
}

 

Change

ServiceModel OM cleanup: Addressing, Filtering, Message

Description

  • IClientChannel.InstanceHeaders will be renamed to Headers.
  • InstanceContext.InstanceHeaders will be renamed to Headers
  • Rename in config to
  • Instead of “XPathFilter xf = new XPathFilter(…); xf.Compile();” just new up the XPathFilter
  • Filter renamed to MessageFilter
  • “Match” methods on the filter tables (IFilterTable) are renamed as follows:

    bool GetMatchingFilter(Message message,
        out Filter filter);
    bool GetMatchingFilter(
        MessageBuffer messageBuffer,
        out Filter filter);

    bool GetMatchingFilters(Message message,
        ICollection results);
    bool GetMatchingFilters(
        MessageBuffer messageBuffer,
        ICollection results);

    bool GetMatchingValue(Message message,
        TFilterValue value);
    bool GetMatchingValue(MessageBuffer messageBuffer,
        TFilterValue value);

    bool GetMatchingValues(Message message,
        ICollection results);
    bool GetMatchingValues(
        MessageBuffer messageBuffer,
        ICollection results);

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")]
public class MyMessage1{}

[MessageContract(Action="Bar")]
public class MyMessage2{}

[ServiceContract]
public class MyContract {
[OperationContract]
public MyMessage1 MyOperation(MyMessage2 msg); }

Code After

[MessageContract] public class MyMessage1{}

[MessageContract] public class MyMessage2{}

[ServiceContract] public class MyContract {
[OperationContract(Action="Bar",ReplyAction="Foo")] public MyMessage1 MyOperation(MyMessage2 msg); }

 

Change

TypedMessageConverter is no longer generic

Type of Origin

System.ServiceModel.TypedMessageConverter

This change effects

OM

Code Before

//Only one overload shown below
MyMsgContr m = TypedMessageConverter.FromMessage(
    myMessage);

Message ms = TypedMessageConverter.ToMessage(m);

Code After

//Only one overload shown below:
TypedMessageConverter tmc = TypedMessageConverter.Create(typeof(MyMsgContr),
    "action");

MyMsgContr m = (MyMsgContr)tmc.FromMessage(myMessage);
Message ms = tmc.ToMessage(m);

 

Change

WS-Addressing CR

Description

For EndpointAddress, the major changes are:
• No longer IXmlSerializable (will be handled by helper classes described later)
• All read/write methods take an AddressingVersion
• EndpointAddressBuilder.Headers is a Collection instead of a List
• Metadata will be dealt with as a first class entitiy
• The first class elements will be Address, Headers, Identity, Metadata, and Extensions.

For the IXmlSerializable change, it's worth realizing that each type serialized with IXmlSerializable must have a single projection.  Since there are multiple addressing version there must be multiple types used to serialize an EPR.  These types exist for the sake of being exposed as part of a contract.  They are not related to the addressing version specified by the binding, so their version does not need to match.  They are simply a way of transmitting EPRs.

This change effects

OM, Wire

After

public sealed class AddressingVersion
{
    // Static properties exposing versions
    public static AddressingVersion WSAddressingV10 { get; }
    public static AddressingVersion WSAddressingAugust2004 { get; }

    // Misc
    public override bool Equals(object obj) {}
    public override int GetHashCode(object obj) {}
    public override string ToString() {}
}

public sealed class MessageVersion
{
    // Static methods to create versions
    public static MessageVersion CreateVersion(
        EnvelopeVersion version) {}
    public static MessageVersion CreateVersion(
        EnvelopeVersion envelopeVersion,
        AddressingVersion addressingVersion) {}

    // Static properties exposing versions
    public static MessageVersion Default { get; }  // S1.2, A1.0
    public static MessageVersion Soap11Addressing10 { get; }
    public static MessageVersion Soap11Addressing200408 { get; }
    public static MessageVersion Soap12Addressing10 { get; }
    public static MessageVersion Soap12Addressing200408 { get; }

    // Instance properties
    public AddressingVersion Addressing { get; }
    public EnvelopeVersion Envelope { get; }

    // Misc
    public override bool Equals(object obj) {}
    public override int GetHashCode() {}
    public override string ToString() {}
}

public class EndpointAddress
{
    // Constructors
    public EndpointAddress(string uri) {}
    public EndpointAddress(Uri uri,
        params AddressHeader[] addressHeaders) {}
    public EndpointAddress(Uri uri, Identity identity,
        params AddressHeader[] addressHeaders) {}
    public EndpointAddress(Uri uri, Identity identity,
        AddressHeaderCollection addressHeaders) {}
    public EndpointAddress(Uri uri, Identity identity,
        AddressHeaderCollection addressHeaders,
        XmlDictionaryReader metadataReader,
        XmlDictionaryReader extensionReader) {}

    // Accessing instance data
    public AddressHeaderCollection Headers { get; }
    public Identity Identity { get; }
    public bool IsAnonymous { get; }
    public bool IsNone { get; }
    public Uri Uri { get; }
    public XmlDictionaryReader GetReaderAtMetadata() {}
    public XmlDictionaryReader GetReaderAtExtensions() {}

    // Constants
    public static Uri AnonymousUri { get; }
    public static Uri NoneUri { get; }

    // Using an EPR
    public void ApplyTo(Message message) {}

    // Misc
    public override bool Equals(object obj) {}
    public override int GetHashCode() {}
    public override string ToString() {}
    public static bool operator==(EndpointAddress address1,
        EndpointAddress address2) {}
    public static bool operator!=(EndpointAddress address1,
        EndpointAddress address2) {}

    // Deserializing
    public static ReadFrom(AddressingVersion version, XmlReader reader)
        {}
    public static ReadFrom(AddressingVersion version,
        XmlDictionaryReader reader) {}
    public static ReadFrom(AddressingVersion version,
        XmlDictionaryReader reader,
        XmlDictionaryString localName,
        XmlDictionaryString ns) {}

    // Serializing
    public void WriteContentsTo(AddressingVersion version,
        XmlWriter writer) {}
    public void WriteContentsTo(AddressingVersion version,
        XmlDictionaryWriter writer) {}

    public void WriteTo(AddressingVersion version, XmlWriter writer) {}
    public void WriteTo(AddressingVersion version, XmlWriter writer,
        string localName, string ns) {}
    public void WriteTo(AddressingVersion version,
        XmlDictionaryWriter writer) {}
    public void WriteTo(AddressingVersion version,
        XmlDictionaryWriter writer,
        XmlDictionaryString localName,
        XmlDictionaryString ns) {}
}

public class EndpointAddressBuilder
{
    public EndpointAddressBuilder() {}
    public EndpointAddressBuilder(EndpointAddress address) {}
    public EndpointAddress ToEndpointAddress() {}

    // Instance properites
    public Uri Uri { get; set; }
    public Identity Identity { get; set; }
    public Collection Headers { get; }

    // Instance metadata/extension data
    public XmlDictionaryReader GetReaderAtMetadata() {}
    public void SetMetadataReader(XmlDictionaryReader reader) {}
    public XmlDictionaryReader GetReaderAtExtensions() {}
    public void SetExtensionReader(XmlDictionaryReader reader) {}
}

public class EndpointAddressAugust2004 : IXmlSerializable
{
    public static EndpointAddress200408 FromEndpointAddress
        (EndpointAddress address) {}
    public static XmlQualifiedName GetSchema(XmlSchemaSet xmlSchemaSet)
        {}

    public EndpointAddress ToEndpointAddress() {}
}

public class EndpointAddressV10 : IXmlSerializable
{
    public static EndpointAddress10 FromEndpointAddress
        (EndpointAddress address) {}
    public static XmlQualifiedName GetSchema(XmlSchemaSet xmlSchemaSet)
        {}

    public EndpointAddress ToEndpointAddress() {}
}

Code Before

[ServiceContract]
public interface FooContract
{
    [OperationContract]
    EndpointAddress Resolve();
}

Code After

[ServiceContract]
public interface FooContract
{
    [OperationContract]
    EndpointAddress10 Resolve();
}

 

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.
Reason for change: Having the same quota apply to both send and receive means that for a service (or client) to send large messages it must also open itself to receiving large messages which is undesirable. The new quota applies only to received messages. There is no built-in quota on the size of sent messages, but the application code can limit the size of the messages it generates.

Type of Origin

System.ServiceModel.TransportBindingElement

This change effects

OM, Config

Before

MaxMessageSize

After

MaxReceivedMessageSize

Code Before

TransportBindingElement be;
// code to instantiate a transport binding element omitted
be.MaxMessageSize=6000;

Code After

TransportBindingElement be;
// code to instantiate a transport binding element omitted
be.MaxReceivedMessageSize=6000;

 

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:
ServiceType -> Type
BindingSectionName -> Binding
ContractType -> Contract

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



   
       
           
               
           

           
               
           

           
              
           

       

   

 

Queue Changes in System.ServiceModel

 

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
{
  ...
  Uri deadLetterQueue;
}

After

public enum DeadLetterQueue { None, System, Custom };
public class MsmqBindingElementBase
{
  ...
  DeadLetterQueue deadLetterQueue;
  Uri customDeadLetterQueue;
 
}

Code Before

NetMsmqBinding binding = new NetMsmqBinding();
binding.DeadLetterQueue = "net.msmq://localhost/AppDLQ";

Code After

NetMsmqBinding binding = new NetMsmqBinding();
binding.DeadLetterQueue = DeadLetterQueue.Custom;
binding.CustomDeadLetterQueue = "net.msmq://localhost/AppDLQ";

 

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.

 

PeerChannel changes in System.ServiceModel

 

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");
NetPeerTcpBinding binding = new NetPeerTcpBinding();
binding.Security.Mode = SecurityMode.TransportWithMessageCredential;
ChannelFactory barf = new ChannelFactory(binding,epa);
NetPeerTcpBinding binding = new NetPeerTcpBinding();
binding.Security.Mode = SecurityMode.Transport;
ChannelFactory barf2 = new ChannelFactory(binding2,epa);

Code After

EndpointAddress epa = new EndpointAddress("net.p2p://foo/bar");
NetPeerTcpBinding binding = new NetPeerTcpBinding();
binding.Security.Mode = SecurityMode.TransportWithMessageCredential;
ChannelFactory barf = new ChannelFactory(binding,epa);
NetPeerTcpBinding binding = new NetPeerTcpBinding();
binding.Security.Mode = SecurityMode.TransportWithMessageCredential;
ChannelFactory barf2 = new ChannelFactory(binding2,epa);

 

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();
binding.ListenIPAddress = myIPAddressInStringForm;

Code After

NetPeerTcpBinding binding = new NetPeerTcpBinding();
binding.ListenIPAddress = IPAddress.Parse(myIPAddressInStringForm);

 

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
{
    public sealed class PnrpPeerResolverBindingElement :
        PeerResolverBindingElement
}

namespace System.ServiceModel.Channels
{
    public abstract class PeerMessagePropagationFilter{…}
    abstract public class PeerNode: IExtension{…}
    public class PeerHashToken : SecurityToken // Becoming Private
    public class PeerRequestSecurityToken : RequestSecurityToken{…}
    public enum PeerMessagePropagation {…}
    public enum PeerMessageOrigination {…}
}

namespace System.ServiceModel.Configuration
{
    public partial class NetPeerTcpBindingElement :
        StandardBindingConfigurationElement{…}
    public partial class NetPeerTcpBindingSection :
        StandardBindingSection         NetPeerTcpBindingElement>{…}
    public partial class PeerTransportSection : TransportSection {…}
    public class PnrpPeerResolverSection :
        BindingElementExtensionSection {…}
}

namespace System.ServiceModel.Design
{
    public abstract class PeerResolverBindingElement : BindingElement
    {…}
}

After

namespace System.ServiceModel
{
    public sealed class PnrpPeerResolverBindingElement :
        PeerResolverBindingElement {…}
    public abstract class PeerMessagePropagationFilter {…}
    abstract public class PeerNode: IExtension {…}
    public abstract class PeerResolverBindingElement : BindingElement
    {…}
    public enum PeerMessagePropagation {…}
    public enum PeerMessageOrigination {…}
}

namespace System.ServiceModel.Security
{
    public class PeerRequestSecurityToken : RequestSecurityToken {…}
}

namespace System.ServiceModel.Configuration
{
    public partial class NetPeerTcpBindingElement :
        StandardBindingConfigurationElement {…}
    public partial class NetPeerTcpBindingSection :
        StandardBindingSection         NetPeerTcpBindingElement> {…}
    public partial class PeerTransportSection : TransportSection {…}
    public class PnrpPeerResolverSection :
        BindingElementExtensionSection
}

 

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:
NetPeerTcpBinding binding = new NetPeerTcpBinding();
binding.Resolver.Mode = PeerResolverMode.Custom;
binding.Resolver.Custom.Address = new EndpointAddress(...);
binding.Resolver.Custom.Binding = bindingToResolver;

//to implement a custom resolver using the default implementation
//provided in WCF,
CustomPeerResolverService crs = new CustomPeerResolverService();
crs.CleanupInterval = TimeSpan.FromMinutes(2);
crs.ControlShape = false;
ServiceHost customResolver = new ServiceHost(crs);
customResolver.AddServiceEndpoint(typeof(IPeerResolverContract),
    bindingToResolver,new Uri(CustomResolverEpr));
crs.Open();
customResolver.Open();

 

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() to retrieve the peernode instance associated with the channel.

PeerNode.IsOpen and PeerNode.Get() are removed.

Code Before

[Peer]
public interface IFoo{}

ChannelFactory foocf = new ChannelFactory(...);
IChannel channel = foocf.CreateChannel();
PeerNode node = channel.Extensions.Find();

Code After

public interface IFoo{}

ChannelFactory foocf = new ChannelFactory(...);
IChannel channel = foocf.CreateChannel();
PeerNode node = channel.GetProperty();

 

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();
binding.PeerNodeAuthenticationMode =
PeerAuthenticationMode.MutualCertificate;
binding.MessageAuthentication = true;

Code After

NetPeerTcpBinding binding = new NetPeerTcpBinding();
binding.Security.Mode = SecurityMode.TransportWithMessageCredential;
binding.Security.Transport.CredentialType = PeerTransportCredentialType.Certificate;

 

Security changes in System.ServiceModel

 

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.

Remove OperationAccessCheck

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
1. Remove SymmetricSecurityBindingElement.DefaultProtectionLevel
2. Remove AsymmetricSecurityBindingElement.DefaultProtectionLevel
3. Remove FederatedMessageSecurityOverHttp.DefaultProtectionLevel
4. Remove MessageSecurityOverHttp.DefaultProtectionLevel
5. Remove MessageSecurityOverMsmq.DefaultProtectionLevel
6. Remove MessageSecurityOverTcp.DefaultProtectionLevel
7. Remove FederatedMessageSecurityOverHttpElement.DefaultProtectionLevel
8. Remove MessageSecurityOverHttpElement.DefaultProtectionLevel
9. Remove MessageSecurityOverMsmqElement.DefaultProtectionLevel
10. Remove MessageSecurityOverTcpElement.DefaultProtectionLevel
11. Remove SecuritySection.DefaultProtectionLevel
12. Remove the “DefaultProtectionLevel” administration property in EndpointInstanceProvider
13. Add ProtectionLevel property to ServiceContractAttribute
14. Add ProtectionLevel property to OperationContractAttribute
15. Add ProtectionLevel property to MessageContractAttribute
16. Add ProtectionLevel property to FaultContractAttribute
17. Add ProtectionLevel property to ServiceDescription
18. Add ProtectionLevel property to OperationDescription
19. Add ProtectionLevel property to MessageDescription
20. Add ProtectionLevel property to FaultDescription
Configuration
1. Remove security\onLevel
2. Remove \bindings\wsFederationBinding\security\message\onLevel
3. Remove \bindings\wsHttpBinding\security\message\onLevel
4. Remove \bindings\wsDualHttpBinding\security\message\onLevel
5. Remove \bindings\netMsmqBinding\security\message\onLevel
6. Remove \bindings\netTcpBinding\security\message\onLevel

This change effects

OM, Config

Code Before


 
   
 

Code After

// defaultProtectionLevel is removed from configuration.
// You need to use ProtectionLevel property on
// ServiceContract | OperationContract | FaultContract |
// MessageContract | MessageHeader | MessageBody attributes.

[ServiceContract(ProtectionLevel=”Sign”)]
public interface IService
{
    [OperationContract(ProtectionLevel=”EncryptAndSign”)]
    void op1(string value);
    [OperationContract]
    Void op2(string value);
}

 

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
System.ServiceModel.WsHttpBinding

This change effects

OM, Config

Before

public abstract class System.ServiceModel.SecurityBindingElement {
    ...
    static public SecurityBindingElement
        CreateSecureConversationBinding(
            Binding bootstrapSecurity);
    static public SecurityBindingElement
        CreateSecureConversationBinding(
            Binding bootstrapSecurity,
            bool requireCancellation);
    static public SecurityBindingElement
      CreateSecureConversationBinding(
          Binding bootstrapSecurity,
          bool requireCancellation,
          ChannelProtectionRequirements
            bootstrapProtectionRequirements);
    static public SecurityBindingElement
        CreateSecureConversationOverTransportBinding(
            Binding bootstrapBinding);
    static public SecurityBindingElement
        CreateSecureConversationOverTransportBinding(
            Binding bootstrapBinding, bool requireCancellation);
    static public SecurityBindingElement
        CreateSecureConversationOverTransportBinding(
            Binding bootstrapBinding,
            bool requireCancellation,
            ChannelProtectionRequirements
              bootstrapProtectionRequirements);
   ...
}

After

public abstract class System.ServiceModel.SecurityBindingElement {
    ...
    static public SecurityBindingElement
        CreateSecureConversationBindingElement(
            SecurityBindingElement bootstrapSecurity);
    static public SecurityBindingElement
        CreateSecureConversationBindingElement(
            SecurityBindingElement bootstrapSecurity,
            bool requireCancellation);
    static public SecurityBindingElement
        CreateSecureConversationBindingElement(
            SecurityBindingElement bootstrapSecurity,
            bool requireCancellation,
            ChannelProtectionRequirements
              bootstrapProtectionRequirements);
    ...
}

public class System.ServiceModel.NonDualMessageSecurityOverHttp {
    ...
    public bool EstablishSecurityContext { get; set; }
    ...
}

Code Before


 
   
      bootstrap security settings are here
   

    ...
 

 
            bootstrapBindingConfiguration="bootstrap"
        bootstrapBindingSectionName="customBinding" ...>
      ...
   

    ...
 

Code After


 
   
     
        bootstrap security settings are here
     

      ...
   

    ...
 




 
   
     
   

 

 

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
{
 ...
 public ServiceAuthorization Authorization { get; }
 ...
}

After

public abstract class ServiceHostBase
{
 ...
 public ServiceAuthorizationBehavior Authorization { get; }
 ...
}

Code Before

void Func ( ServiceHost sh )
{
  sh.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.UseWindowsGroups;
 
  ServiceAuthorizationBehavior sab = sh.Description.Behaviors.Find();
  sab.ImpersonateCallerForAllServiceOperations = true;
}

Code After

void Func ( ServiceHost sh )
{
  sh.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.UseWindowsGroups;
  sh.Authorization.ImpersonateCallerForAllServiceOperations = true;
}

 

Change

Refactor Authorization Framework

This change effects

OM, Config

Before

public sealed class ServiceAuthorizationBehavior : IServiceBehavior
{
 public ServiceAuthorizationBehavior();
 public AuthorizationDomain AuthorizationDomain { get; set; }
 public OperationRequirement OperationRequirement { get; set; }
 public PrincipalPermissionMode PrincipalPermissionMode { get; set; }
 public bool ImpersonateCallerForAllServiceOperations { get; set; }
}

public abstract class OperationRequirement
{
 public abstract bool AccessCheck(OperationContext operationContext);
}

public class ServiceSecurityContext
{

 public ServiceSecurityContext(ReadOnlyCollection authorizationPolicies);
 public ServiceSecurityContext(AuthorizationDomain authorizationDomain);

 public static ServiceSecurityContext Anonymous { get; }
 public AuthorizationDomain AuthorizationDomain { get; }
 public static ServiceSecurityContext Current { get; }
 public bool IsAnonymous { get; }
 public IIdentity PrimaryIdentity { get; }
 public WindowsIdentity WindowsIdentity { get; }
 public AuthorizationContext AuthorizationContext { get; }
}

public sealed class SupportingTokenSpecification : SecurityTokenSpecification
{
 public SecurityToken SecurityToken { get; }
 public SecurityTokenAttachmentMode SecurityTokenAttachmentMode { get; }
}

public class SecurityMessageProperty : IMessageProperty
{
 public SecurityMessageProperty();
 public ServiceSecurityContext ServiceSecurityContext { get; set; }
 public SecurityToken PrimaryToken { get; }
 public string SenderIdPrefix { get; set; }
 public bool HasIncomingSupportingTokens { get; }
 public Collection IncomingSupportingTokens { get; }
 public IMessageProperty CreateCopy();       
 public static SecurityMessageProperty GetOrCreate(Message message);
}

public static class ClaimTypes
{
 public static string Anonymous { get; }
 public static string Database { get; }
 public static string Dns { get; }
 public static string Email { get; }
 public static string File { get; }
 public static string Hash { get; }
 public static string KeyHolder { get; }
 public static string Name { get; }
 public static string Role { get; }
 public static string Rsa { get; }
 public static string Sid { get; }
 public static string Spn { get; }
 public static string System { get; }
 public static string Thumbprint { get; }
 public static string Upn { get; }
 public static string Uri { get;}
 public static string X500DistinguishedName { get; }
}

public static class Rights
{
 public static string Identity { get;}
 public static string Read { get;}
 public static string Write { get;}
 public static string PossessProperty { get; }
}

public sealed class Claim
{
 public Claim(string claimType, object resource, string right);
 public static Claim System { get; }
 public static Claim Anonymous { get; }
 public object Resource { get; }
 public string ClaimType { get; }
 public string Right { get; }
 public static Claim CreateDnsClaim(string dns);
 public static Claim CreateFileAccessClaim(string fileName, FileAccess fileAccess);
 public static Claim CreateHashClaim(byte[] hash);
 public static Claim CreateMailAddressClaim(MailAddress mailAddress);
 public static Claim CreateNameClaim(string name);
 public static Claim CreateRoleClaim(string role);
 public static Claim CreateRsaClaim(RSA rsa);
 public static Claim CreateSpnClaim(string spn);
 public static Claim CreateThumbprintClaim(byte[] thumbprint);
 public static Claim CreateUpnClaim(string upn);
 public static Claim CreateUriClaim(Uri uri);
 public static Claim CreateWindowsSidClaim(SecurityIdentifier sid);
 public static Claim CreateX500DistinguishedNameClaim(X500DistinguishedName x500DistinguishedName);
}

After

public class ServiceAuthorizationBehavior
{
 public ServiceAuthorizationBehavior();
 public Collection AuthorizationPolicies { get; }
 public ServiceAuthorizationManager ServiceAuthorizationManager { get; set; }
 public PrincipalPermissionMode PrincipalPermissionMode { get; set; }  
 public bool ImpersonateCallerOnServiceOperations { get; set; }
}

public class ServiceAuthorizationManager
{
 public virtual bool CheckAccess(OperationContext opContext);
 protected virtual IList GetPolicies ( OperationContext opContext);
 protected virtual bool CheckAccessCore(OperationContext opContext);
}

public class ServiceSecurityContext
{

 public ServiceSecurityContext (
  ReadOnlyCollection externalPolicies);
       
 public static ServiceSecurityContext Anonymous { get; }
 public static ServiceSecurityContext Current { get; }
 public bool IsAnonymous { get; }
 public IIdentity PrimaryIdentity { get; }
 public WindowsIdentity WindowsIdentity { get; }
 public ReadOnlyCollection ExternalAuthorizationPolicies { get; }

  // This will be null till set
  public AuthorizationContext AuthorizationContext { get; set; }
}

public class SecurityTokenSpecification
{
 public SecurityToken SecurityToken { get; }
 public ReadOnlyCollection AuthorizationPolicies { get; }
}

public sealed class SupportingTokenSpecification : SecurityTokenSpecification
{
 public SecurityTokenAttachmentMode SecurityTokenAttachmentMode { get; }
}

public class SecurityMessageProperty : IMessageProperty
{
 public SecurityMessageProperty();
 public ServiceSecurityContext ServiceSecurityContext { get; set; }
 public SecurityTokenSpecification ProtectionToken { get; }
 public SecurityTokenSpecification InitiatorToken { get; }
 public SecurityTokenSpecification RecipientToken { get; }
 public SecurityTokenSpecification TransportToken { get; }
 public string SenderIdPrefix { get; set; }
 public bool HasIncomingSupportingTokens { get; }
 public Collection IncomingSupportingTokens { get; }
 public IMessageProperty CreateCopy();       
 public static SecurityMessageProperty GetOrCreate(Message message);
}

public static class ClaimTypes
{
 public static string Anonymous { get; }
 public static string Dns { get; }
 public static string MailAddress { get; }
 public static string Hash { get; }
 public static string Name { get; }
 public static string Rsa { get; }
 public static string Sid { get; }
 public static string Spn { get; }
 public static string System { get; }
 public static string Thumbprint { get; }
 public static string Upn { get; }
 public static string X500DistinguishedName { get; }
}

public static class Rights
{
 public static string Identity { get;}
 public static string PossessProperty { get; }
}

public class Claim
{
 public Claim(string claimType, object resource, string right);

 public static IEqualityComparer DefaultComparer { get; }

 public int GetHashCode(); // Delegates to DefaultComparer.GetHashCode.
 public bool Equals(Claim c); // Delegates to DefaultComparer.Equals

 public static Claim System { get; }
 public static Claim Anonymous { get; }

 public object Resource { get; }
 public string ClaimType { get; }
 public string Right { get; }

 // Turn key claims
 public static Claim CreateDnsClaim(string dns);
 public static Claim CreateMailAddressClaim(MailAddress mailAddress);
 public static Claim CreateHashClaim(byte[] hash);
 public static Claim CreateNameClaim(string name);
 public static Claim CreateRsaClaim(RSA rsa);
 public static Claim CreateSpnClaim(string spn);
 public static Claim CreateThumbprintClaim(byte[] thumbprint);
 public static Claim CreateUpnClaim(string upn);
 public static Claim CreateWindowsSidClaim(SecurityIdentifier sid);
 public static Claim CreateX500DistinguishedNameClaim(X500DistinguishedName x500DistinguishedName);
}

Code Before


 
   
   
 

Code After


 

Change

Changes to the TransactionFlowOption enumeration

Type of Origin

System.ServiceModel.TransactionFlowOption

This change effects

OM

Before

public enum TransactionFlowOption
{
      NotAllowed,
      Allowed,
      Required
}
 

After

public enum TransactionFlowOption
{
      NotAllowed,
      Allowed,
      Mandatory
}
 

 

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

 

System.ServiceModel.Channels

 

Change

Finish Cleaning-Up Channel Interfaces

Description

This change covers several individual cleanup items related to the channel interfaces.

-          A GetProperty method will be added to the IChannel interface.

-          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 interface that derives from the existing IChannelFactory interface. The CanCreateChannel method was removed from IChannelFactory, and the CreateChannel methods were moved from IChannelFactory to IChannelFactory. The CreateChannel methods no longer need a generic parameter to specify the return type; they simply have a return type of TChannel.
The BuildChannelFactory method on the BindingElement class was modified to take a generic TChannel parameter, and return an IChannelFactory. A generic CanBuildChannelFactory method was also added. Similar changes have been made to the BuildChannelFactory and CanBuildChannelFactory methods on the Binding class.

Note that the following code also incorporates some of the other changes mentioned, specifically some general channel OM cleanup items as well as the removal of the composite duplex channel creation APIs.

This change effects

OM

After

    //
    // Channel Factory
    //
    public interface IChannelFactory : IChannelManager
    {
        Type ChannelType { get; }
    }

    public interface IChannelFactory : IChannelFactory
    {
        TChannel CreateChannel(EndpointAddress address);
        TChannel CreateChannel(EndpointAddress address, Uri via);
    }

    //
    // Binding
    //
    public abstract class Binding : IDefaultCommunicationTimeouts
    {

        public virtual IChannelFactory
            BuildChannelFactory(
                BindierParameterCollection parameters){…}

        public virtual bool CanBuildChannelFactory(
            BinderParameterCollection parameters){…}
    //
    // Binding element
    //
    public abstract class BindingElement
    {

        public virtual IChannelFactory
            BuildChannelFactory(
                ChannelBuildContext context){…}

        public virtual bool CanBuildChannelFactory(
            ChannelBuildContext context){…}
    }

 

Change

Rename WsFederationBinding and MessageCredentialType.Infocard

This change effects

OM, Config

Before

public class WSFederationBinding : WSHttpBindingBase { }

public enum MessageCredentialType
{
      None,
      Windows,
      UserName,
      Certificate,
      Infocard
}

After

public class WSFederationHttpBinding : WSHttpBindingBase { }

public enum MessageCredentialType
{
      None,
      Windows,
      UserName,
      Certificate,
      IssuedToken
}

Code Before

WSFederationBinding b = new WSFederationBinding();


 
 
  ...
 

 




WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);
b.Security.Message.ClientCredentialType = MessageCredentialType.Infocard;


 
 
  
   
    
   

  

 

 

Code After

WSFederationHttpBinding b = new WSFederationHttpBinding();


 
 
  ...
 

 




WSHttpBinding b = new WSHttpBinding(SecurityMode.Message);
b.Security.Message.ClientCredentialType = MessageCredentialType.IssuedToken;


 
 
  
   
    
   

  

 

 

 

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.  Changed CompositeDuplexBindingElement.BuildChannelListener to support creating a IChannelListener.  Removed overloads of the IChannelFactory.CreateChannel that take a filter and priority.

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 or BuildChannelListener where TChannel is IInputSessionChannel or IOutputSessionChannel) will now get an ArgumentException stating that the channel type is not supported.
Note that the ServiceModel abstracts away this issue by creating IDuplexSessionChannels to handle the one-way session over TCP and Named Pipes so there is no loss of functionality for programs written at the Service Model layer.

This change effects

Behavior

Code Before

//building an IInputSession Channel Factory with TCP
//this also applies for IOutputSession
//and it applies for BuildChannelListener
TcpTransportBindingElement tcpbe=new TcpTransportBindingElement();
BindingContext context=new BindingContext(null,new BindingParameterCollection());
IChannelFactory cf=tcpbe.BuildChannelFactory(context);

//similarly with named pipes
NamedPipeTransportBindingElement npbe=new NamedPipeTransportBindingElement();
cf=npbe.BuildChannelFactory(context);

Code After

// build an IDuplexSessionChannel channel factory instead
TcpTransportBindingElement tcpbe=new TcpTransportBindingElement();
BindingContext context=new BindingContext(null,new BindingParameterCollection());
IChannelFactory cf=tcpbe.BuildChannelFactory(context);

//similarly with named pipes
NamedPipeTransportBindingElement npbe=new NamedPipeTransportBindingElement();
cf=npbe.BuildChannelFactory(context);

 

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

 

System.ServiceModel.Description

 

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 {
  public bool GenerateAsyncMethods { get; set; }
  public bool GenerateChannelInterface { get; set; }
  public bool GenerateInternalTypes { get; set; }
  public bool GenerateProxyClass { get; set; }
  public bool GenerateTypedMessages { get; set; }
}
System.ServiceModel.Design.ContractExportBehavior
System.ServiceModel.Channels.DirectionalAction
System.SerivceModel.Channels.IRequestReplyCorrelator
System.ServiceModel.Design.PolicyConversionContext {
  public override ICollection GetBindingAssertions();
  public override ICollection GetMessageBindingAssertions(MessageDescription message);
  public override ICollection GetOperationBindingAssertions(OperationDescription operation);
}
System.ServiceModel.Design.IWsdlImporter
System.ServiceModel.Design.IPolicyImporter
System.ServiceModel.MessageBodyArrayAttribute

After

System.ServiceModel.Description.ServiceContractGenerator {
  public ServiceContractGenerationOptions Options
}
System.ServiceModel.Description.PolicyConversionContext {
  public abstract PolicyAssertionCollection GetBindingAssertions();
  public abstract PolicyAssertionCollection GetOperationBindingAssertions(OperationDescription operation);
  public abstract PolicyAssertionCollection GetMessageBindingAssertions(MessageDescription message);
  public abstract PolicyAssertionCollection GetFaultBindingAssertions(FaultDescription fault);
}
System.ServiceModel.Description.IWsdlImportExtension
System.ServiceModel.Description.IPolicyImportExtension

 

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
System.ServiceModel.GetMetadataRequestParameters
System.ServiceModel.GetMetadataResponse
System.ServiceModel.GetRequest
System.ServiceModel.GetResponse
System.ServiceModel.IMetadataExchange

After

System.ServiceModel.Configuration.MetadataExchangeEndpointElement
System.SerivceModel.Configuration.
MetadataExchangeEndpointElementCollection

System.ServiceModel.Description.ServiceMetadataBehaivor {
  public void AddMetadataEndpoint(Uri uri);
  public void AddMetadataEndpoint(Uri uri, Binding binding);
}

 

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);
ServiceEndpointCollection endpoints = resolver.RetrieveEndpoints();

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

 

System.ServiceModel.MsmqIntegration

 

Change

Namespace Added: System.ServiceModel.MsmqIntegration

This change effects

OM

Before

System.ServiceModel

After

System.ServiceModel.MsmqIntegration

Code Before

using System.ServiceModel;
// for both Service Model and MSMQ integration infrastructure

Code After

using System.ServiceModel;
// for general Service Model infrastructure

Using System.ServiceModel.MsmqIntegration;
// for MSMQ integration infrastructure

 

Hosting and Activation 

 

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


 
   
              type="Microsoft.ServiceModel.Samples.CalculatorService">
                  address=""
          binding="wsHttpBinding"
          contract="Microsoft.ServiceModel.Samples.ICalculator" />
     
   

 

Code After


 
   
              name="Microsoft.ServiceModel.Samples.CalculatorService">
                  address=""
          binding="wsHttpBinding"
          contract="Microsoft.ServiceModel.Samples.ICalculator" />
     
   

 

 

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)
itcpas (Indigo TCP Activation Service)
inpas (Indigo Named Pipe Activation Service)
imsmqas (Indigo MSMQ Activation Service)

After

NetTcpPortSharing (Net.Tcp Port Sharing Service)
NetTcpActivator (Net.Tcp Listener Adapter)
NetPipeActivator (Net.Pipe Listener Adapter)
NetMsmqActivator (Net.Msmq Listener Adapter)

 

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

 

System.ServiceModel.Activation

 

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;

 

System.ServiceModel.Activation.Configuration

 

Change

Type Name Update - IndigoListenerSectionGroup -> ServiceModelActivationSectionGroup

Type of Origin

IndigoListenerSectionGroup

This change effects

OM

Code Before

string smSvcHostInstallPath = System.IO.Directory.GetParent(
    typeof(object).Assembly.Location).FullName + "\\SMSvcHost.exe";

IndigoListenerSectionGroup sectionGroup = IndigoListenerSectionGroup.GetSectionGroup(
    ConfigurationManager.OpenExeConfiguration(smSvcHostInstallPath));

Console.WriteLine(sectionGroup.SectionGroupName);

Code After

string smSvcHostInstallPath = System.IO.Directory.GetParent(
    typeof(object).Assembly.Location).FullName + "\\SMSvcHost.exe";

ServiceModelActivationSectionGroup sectionGroup = ServiceModelActivationSectionGroup.GetSectionGroup(

    ConfigurationManager.OpenExeConfiguration(smSvcHostInstallPath));

Console.WriteLine(sectionGroup.SectionGroupName);

 

Serialization

 

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,
    string[] inclusivePrefixes);

 

System.Runtime.Serialization

 

Change

Serialization OM refactoring

Description

Change 4:
Rename config section XmlFormatterSection to DataContractSerializerSection

See Before and after for changes 1 – 3

This change effects

OM, Config

Before

//Change 1
XmlFormatter xf1 = new XmlFormatter(SerializationMode.SharedContract);
XmlFormatter xf2 = new XmlFormatter(SerializationMode.SharedType);
MyType mt = new MyType();
xf1.Serialize(myXmlWriter, mt);
object obj = xf2.Deserialize(myXmlReader);

//Change 2
[ContractNamespace(ContractNamespace=”urn:ms”, ClrNamespace=”MyNs”)]

//Change 3
[DataContract]
public class MyType : IUnknownSerializationData
{
            UnknownSerializationData UnknownData { … }
}

//also see description for change 4

After

//Change 1
DataContractSerializer xf1 = new DataContractSerializer(typeof(MyType));
NetDataContractSerializer xf2 = new NetDataContractSerializer();
MyType mt = new MyType();
xf1.WriteObject(myXmlWriter, mt);
object obj = xf2.ReadObject(myXmlReader);

//Change 2
[ContractNamespace(“urn:ms”, ClrNamespace=”MyNs”)]

//Change 3
[DataContract]
public class MyType : IExtensibleDataObject
{
            ExtensionDataObject ExtensionData { … }
}

//also see description for change 4

 

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

 

Security

 

Change

Security OM Cleanup

Description

1. Internalize Identity.ReadIdentity method
2. Internalize Identity.WriteTo method
3. Internalize Identity.WriteContentsTo method in the base and derived classes

Remove SecurityStateEncoder.AsReadOnly() method.

1. SecurityToken.EffectiveTime -> ValidFrom
2. SecurityToken.SetEffectiveTime() -> SetValidFrom()
3. SecurityToken.ExpirationTime -> ValidTo
4. SecurityToken.SetExpirationTime() -> SetValidTo()

Change the SecurityKeyIdentifier.TryFind signature from
public TClause TryFind() where TClause : SecurityKeyIdentifierClause
To:
public bool TryFind(out TClause clause) where TClause : SecurityKeyIdentifierClause

SecurityBindingElement.CreateMutualCertificateUncorrelatedBinding -> CreateMutualCertificateDuplexBinding
Rename the value “mutualCertificateUncorrelated” allowed by \security\ode to “mutualCertificateDuplex”.

1. Remove SecurityMessageProperty.PrimaryToken
2. Add SecurityMessageProperty.ProtectionToken
3. Add SecurityMessageProperty.InitiatorToken
4. Add SecurityMessageProperty.RecipientToken
5. Add SecurityMessageProperty.TransportToken

Unseal the following classes:
1. DataProtectionSecurityStateEncoder
2. DsaKeyIdentifierClause
3. GenericXmlSecurityToken
4. KeyNameIdentifierClause
5. LocalIdKeyIdentifierClause
6. MessagePartSpecification
7. RsaKeyIdentifierClause
8. SamlAssertionKeyIdentifierClause
9. SecurityContextKeyIdentifierClause
10. SecurityContextSecurityToken
11. SecurityKeyIdentifier
12. SecurityTokenResolver
13. SupportingTokenAuthenticatorSpecification
14. SupportingTokenProviderSpecification
15. SupportingTokenSpecification
16. Tokens.SupportingTokenRequirements
17. WrappedKeySecurityToken
18. WrappedKeySecurityTokenAuthenticator
19. X509IssuerSerialKeyIdentifierClause
20. X509RawDataKeyIdentifierClause
21. X509SubjectKeyIdentifierClause
22. X509ThumbprintKeyIdentifierClause
23. Claim

API
1. LocalServiceSecuritySettings.MaxConcurrentSessions -> MaxPendingSessions
2. LocalServiceSecuritySettingsElement.MaxConcurrentSessions -> MaxPendingSessions
3. Change the name of administration property in EndpointInstanceProvider from “MaxConcurrentSessions” to “MaxPendingSessions”
Configuration
1. \security\localServiceSettings\ssions -> \security\localServiceSettings\ons

Move the following public classes from S.SM.S.P to S.SM.S:
1. ChannelProtectionRequirements
2. ScopedMessagePartSpecification
3. RequestSecurityToken
4. RequestSecurityTokenResponse
5. SecurityNegotiationException
6. IKeySizeValidator

Rename FederationServiceIssuedSecurityTokenProvider to IssuedSecurityTokenProvider.

Renamed KerberosTicketHashIdentifierClause -> KerberosTicketHashKeyIdentifierClause

This change effects

OM, Config

 

System.ServiceModel.Security

 

Change

Remove ProtectTokens property from AsymmetricSecurityBindingElement and SymmetricSecurityBindingElement

Description

API
1. remove ProtectTokens property from AsymmetricSecurityBinding
2. remove ProtectTokens property from SymmetricSecurityBinding
Configuration
1. remove protectTokens property from security section in configuration for custom bindings

Type of Origin

System.ServiceModel.Security.AsymmetricSecurityBindingElement
System.ServiceModel.Security.SymmetricSecurityBindingElement

This change effects

OM, Config

 

Change

IdentityVerifier extensibility

Type of Origin

System.ServiceModel.Security.IdentityVerifier

This change effects

OM

Before

public class IdentityVerifier
{
    public IdentityVerifier() { }
    public static IdentityVerifier CreateDefault() { }
    public static IdentityVerifier CreateDefault(
        bool isHostNameNormalized) { }
    public bool CheckAccess(EndpointAddress reference,
        Message message) { }
    public virtual bool CheckAccess(Identity identity,
        AuthorizationContext authContext) { }
    public virtual bool TryGetIdentity(EndpointAddress reference,
        out Identity identity) { }
}

After

public abstract class IdentityVerifier
{
    protected IdentityVerifier() { }
    public static IdentityVerifier CreateDefault() { }
    public abstract bool CheckAccess(Identity identity,
        AuthorizationContext authContext) { }
    public abstract bool TryGetIdentity(EndpointAddress reference,
        out Identity identity) { }
}

 

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
System.ServiceModel.Security.SecurityStandardsManager

This change effects

OM, Config

Before

public enum System.ServiceModel.Security.SecurityVersion
{
    Default = 1,
    WSSecurityJan2004 = 0,
    WSSecurityXXX2005 = 1
}

After

public abstract class System.ServiceModel.Security.SecurityVersion
{
    public static SecurityVersion WSSecurity10 { get; }
    public static SecurityVersion WSSecurity11 { get; }
    public static SecurityVersion Default { get; }
}

public abstract class MessageSecurityVersion
{
    public static MessageSecurityVersion
        WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005?
WSSecurityPolicy11
    { get; }
    public static MessageSecurityVersion
        WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005?
WSSecurityPolicy11BasicSecurityProfile10
    { get; }
    public static MessageSecurityVersion
         WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005?
WSSecurityPolicy11BasicSecurityProfile10
    { get; }
    public static MessageSecurityVersion Default { get; }
    public abstract SecurityVersion SecurityVersion { get; }
    public abstract BasicSecurityProfileVersion
        BasicSecurityProfileVersion { get; }
    public abstract SecurityTokenVersion SecurityTokenVersion
    { get; }
}

 

System.ServiceModel.Security.Tokens

 

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
{
 ...
 public Collection RequiredClaimTypes { get; }
 ...
}

After

public class ClaimTypeRequirement
{
  public ClaimTypeRequirement ( string claimType, bool isOptional );
  public string ClaimType { get; }
  public bool IsOptional { get; }
}

public class IssuedSecurityTokenParameters : SecurityTokenParameters
{
 ...
 public Collection ClaimTypeRequirements { get; }
 ...
}

Code Before

WSFederationBinding binding =
   WSFederationBinding(WSFederationSecurityMode.Message);
binding.Security.Message.IssuerAddress = issuerAddress;
binding.Security.Message.IssuerBinding = issuerBinding;
binding.Security.Message.RequiredClaimTypes.Add(
    SamlConstants.EmailNamespace + "/" + SamlConstants.EmailName);



 
 
  
   
    
     
      
      
     

    

   

  

 

 

Code After

WSFederationBinding binding =
   WSFederationBinding(WSFederationSecurityMode.Message);
binding.Security.Message.IssuerAddress = issuerAddress;
binding.Security.Message.IssuerBinding = issuerBinding;
binding.Security.Message.ClaimTypeRequirements.Add(
    new ClaimTypeRequirement(SamlConstants.Namespace + "/" +  
    SamlConstants.EmailName, true));



 
 
  
   
    
     
      
      
     

    

   

  

 

 

 

System.IdentityModel

 

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;

The following classes were moved from System.ServiceModel to System.IdentityModel.Tokens
• AsymmetricSecurityKey
• BinaryKeyIdentifierClause
• KerberosReceiverSecurityToken
• KerberosRequestorSecurityToken
• KerberosTicketHashIdentifierClause
• LocalIdKeyIdentifierClause
• RsaKeyIdentifierClause
• RsaSecurityKey
• SamlAccessDecision
• SamlAction
• SamlAdvice
• SamlAssertion
• SamlAssertionKeyIdentifierClause
• SamlAttribute
• SamlAttributeStatement
• SamlAudienceRestrictionCondition
• SamlAuthenticationClaimResource
• SamlAuthenticationStatement
• SamlAuthorityBinding
• SamlAuthorizationDecisionClaimResource
• SamlAuthorizationDecisionStatement
• SamlCondition
• SamlConditions
• SamlConstants
• SamlDoNotCacheCondition
• SamlEvidence
• SamlLoader
• SamlSecurityToken
• SamlStatement
• SamlSubject
• SamlSubjectStatement
• SecurityKey
• SecurityKeyIdentifier
• SecurityKeyIdentifierClause
• SecurityKeyUsage
• SecurityToken
• SecurityTokenException
• SecurityTokenTypes
• SecurityTokenValidationException
• SigningCredentials
• SymmetricKey
• SymmetricSecurityKey
• UserNameSecurityToken
• X509AsymmetricSecurityKey
• X509IssuerSerialKeyIdentifierClause
• X509RawDataKeyIdentifierClause
• X509SecurityToken
• X509SubjectKeyIdentifierClause
• X509ThumbprintKeyIdentifierClause

The following classes were moved from System.ServiceModel to System.IdentityModel.Selectors

• SecurityTokenAuthenticator{Abstract}
• X509SecurityTokenAuthenticator
• KerberosSecurityTokenAuthenticator
• UserNamePasswordSecurityTokenAuthenticator
• SamlSecurityTokenAuthenticator
• SecurityTokenProvider {Abstract}
• X509SecurityTokenProvider
• KerberosSecurityTokenProvider
• UserNamePasswordSecurityTokenProvider
• SamlSecurityTokenProvider
• SecurityKeyIdentifier
• SecurityKeyIdentifierClause
• SecurityTokenRequirement
• SecurityTokenResolver

The following classes were moved from System.Security.Authorization or System.ServiceModel.Security.Tokens to System.IdentityModel.Claims
• Claim
• ClaimComparer
• ClaimSet
• DefaultClaimSet
• GenericClaimSet
• WindowsClaimSet
• X509CertificateClaimSet
• XsiConstants

The following classes were moved from System.Security.Authorization or System.ServiceModel.Security.Tokens to System.IdentityModel.Policy
• AcceptClaimSetEventArgs
• AcceptClaimSetEventArgs
• AcceptPolicyEventArgs
• AuthorizationContext
• AuthorizationDomain
• DefaultAuthorizationContext
• DefaultEvaluationContext
• EvaluationContext
• IAuthorizationComponent
• IAuthorizationPolicy
• UnconditionalPolicy
• XsiTraceRecord

The following classes were removed from System.ServiceModel;

• DEREncoding

This change effects

OM

Code Before

using System.Security.Authorization;

AuthorizationContext ac =
OperationContext.Current.ServiceSecurityContext.AuthorizationContext;

Code After

using System.IdentityModel.Policy

AuthorizationContext ac =
OperationContext.Current.ServiceSecurityContext.AuthorizationContext;

 

System.IdentityModel.Tokens

 

Change

Refactor Token and Credential Frameworks

This change effects

OM, Config

Before

public abstract class SecurityToken
{

 public abstract
 ReadOnlyCollection AuthorizationPolicies { get; }
 public abstract ReadOnlyCollection SecurityKeys { get; }

 public virtual DateTime EffectiveTime { get; }
 public virtual DateTime ExpirationTime { get; }
 public bool HasBeenValidated { get; }
 public virtual string Id { get; }

 public static string GenerateId();
 public virtual bool IsCurrentlyTimeEffective();

public void Validate();
 public void Validate(SecurityTokenResolver tokenResolver);
 public virtual bool CanCreateKeyIdentifierClause() where T : SecurityKeyIdentifierClause;
 public virtual T CreateKeyIdentifierClause() where T : SecurityKeyIdentifierClause;
 public virtual bool MatchesKeyIdentifierClause(SecurityKeyIdentifierClause keyIdentifierClause);
 public virtual SecurityKey ResolveKeyIdentifierClause(SecurityKeyIdentifierClause keyIdentifierClause);
}

public abstract class SecurityTokenParameters : ICloneable
{
 protected SecurityTokenParameters(SecurityTokenParameters other);
 protected SecurityTokenParameters();
 public SecurityTokenInclusionMode InclusionMode { get; set; }
 public SecurityTokenReferenceStyle ReferenceStyle { get; set; }
 public bool RequireDerivedKeys { get; set; }
 public object Clone();
 protected abstract object CloneCore();
 public override string ToString();
}

public abstract class SecurityTokenProvider : IDisposable
{
 public void Close();
 public void Close(TimeSpan timeout);
 public void Dispose();
 public abstract SecurityToken GetToken(EndpointAddress target, Uri via, TimeSpan timeout);
 public virtual Identity GetIdentityOfSelf();
 public virtual bool WillGetTokenCompleteSynchronously(EndpointAddress target, Uri via);
 public void Open();
 public void Open(TimeSpan timeout);
}

public abstract class SecurityTokenAuthenticator : IDisposable
{
 public void Close();
 public void Close(TimeSpan timeout);
 public void Dispose();
 public virtual Identity GetIdentityOfSelf();
 public void Open();
 public void Open(TimeSpan timeout)
}

public sealed class SecurityTokenResolver
{
 public SecurityTokenResolver();
 public SecurityToken ExpectedWrapper { get; set; }
 public SecurityTokenParameters ExpectedWrapperTokenParameters { get; set; }
 public void Add(SecurityToken token);
 public void Add(SecurityToken token, SecurityTokenReferenceStyle allowedReferenceStyle, SecurityTokenParameters tokenParameters);
 public SecurityToken ResolveToken(SecurityKeyIdentifier keyIdentifier);
 public SecurityKey ResolveSecurityKey(SecurityKeyIdentifierClause keyIdentifierClause);
 public override string ToString();
}

public class SecurityStandardsManager
{
 public SecurityStandardsManager();
 public SecurityStandardsManager(SecurityVersion securityVersion);
 public SecurityStandardsManager(SecurityVersion securityVersion, bool emitBspRequiredAttributes);
 public bool EmitBspRequiredAttributes
 public static SecurityStandardsManager DefaultInstance { get; }
 public SecurityVersion SecurityVersion { get; }
 public virtual IAsyncResult BeginReadToken(XmlReader reader, SecurityTokenResolver tokenResolver, IList allowedTokenAuthenticators, AsyncCallback callback, object state);
 public bool CanReadKeyIdentifier(XmlReader reader);
 public virtual SecurityKeyIdentifierClause CreateKeyIdentifierClauseFromTokenXml(XmlElement element, SecurityTokenReferenceStyle tokenReferenceStyle);
 public virtual SecurityToken EndReadToken(IAsyncResult result, out SecurityTokenAuthenticator usedTokenAuthenticator);
 public virtual SecurityKeyIdentifier ReadKeyIdentifier(XmlReader reader);
 public virtual SecurityKeyIdentifierClause ReadKeyIdentifierClause(XmlReader reader);
 public virtual SecurityToken ReadToken(XmlReader reader, SecurityTokenResolver tokenResolver, IList allowedTokenAuthenticators, out SecurityTokenAuthenticator usedTokenAuthenticator);
 public virtual void WriteKeyIdentifier(XmlDictionaryWriter writer, SecurityKeyIdentifier keyIdentifier);
 public virtual void WriteKeyIdentifierClause(XmlDictionaryWriter writer, SecurityKeyIdentifierClause keyIdentifierClause);
 public virtual void WriteToken(XmlDictionaryWriter writer, SecurityToken token);
}

public class ClientCredentials : SecurityCredentialsManager, IChannelBehavior
{
 public ClientCredentials();
 public IssuedTokenClientCredential IssuedToken { get; }
 public UserNamePasswordClientCredential UserNamePassword { get; }
 public X509CertificateInitiatorClientCredential ClientCertificate { get; }
 public X509CertificateRecipientClientCredential ServiceCertificate { get; }
 public WindowsClientCredential Windows { get; }
 public HttpDigestClientCredential Digest { get; }
 public bool SupportInteractive { get; set; }

 public void ApplyBehavior(ChannelDescription description, ProxyBehavior behavior, BindingParameterCollection parameters);
}

public class ServiceCredentials : SecurityCredentialsManager, IServiceBehavior
{
  public ServiceCredentials();
  public UserNamePasswordServiceCredential UserNamePassword { get; }
  public X509CertificateInitiatorServiceCredential ClientCertificate { get; }
  public X509CertificateRecipientServiceCredential ServiceCertificate { get; }
 public WindowsServiceCredential Windows { get; }
}

After

public abstract class SecurityToken
{
 public abstract ReadOnlyCollection SecurityKeys { get; }
 public abstract DateTime EffectiveTime { get; }
 public abstract DateTime ExpirationTime { get; }
 public abstract string Id { get; }
 
 public virtual bool CanCreateKeyIdentifierClause() where T : SecurityKeyIdentifierClause;
 public virtual T CreateKeyIdentifierClause() where T : SecurityKeyIdentifierClause;
 public virtual bool MatchesKeyIdentifierClause(SecurityKeyIdentifierClause keyIdentifierClause);
 public virtual SecurityKey ResolveKeyIdentifierClause(SecurityKeyIdentifierClause keyIdentifierClause);
}

public class SecurityTokenRequirement
{
 public string TokenType { get; set; }
 public bool RequireCryptoToken { get; set; }
 public bool RequireCancellableToken { get; set; }
 public bool RequireRenewableToken { get; set; }
 public bool RequireRecipientToken { get; set; }
 public KeyType KeyType { get; set; }
 public SecurityAlgorithmSuite SecurityAlgorithmSuite { get; set; }
 public System.Collections.Generic.Dictionary AdditionalProperties { get; }
}

public abstract class SecurityTokenProvider
{
 public SecurityTokenRequirement SecurityTokenRequirement { get; }
 
 public SecurityToken GetToken(TimeSpan timeout);
 public SecurityToken RenewToken(TimeSpan timeout, SecurityToken oldToken);
 public void CancelToken(TimeSpan timeout, SecurityToken token);
 public void SetTokenStatus(SecurityToken token, SecurityTokenUsageStatus status);
 public SecurityTokenUsageStatus GetTokenStatus(SecurityToken token);
}

public abstract class SecurityTokenAuthenticator
{
 public SecurityTokenRequirement SecurityTokenRequirement { get; }
 public bool CanValidateToken(SecurityToken token);
 public ReadOnlyCollection ValidateToken(SecurityToken token, TimeSpan timeout);
}

public abstract class SecurityTokenResolver
{
  public SecurityToken ResolveToken(SecurityKeyIdentifier keyIdentifier);
 public bool TryResolveToken(SecurityKeyIdentifier keyIdentifier, out SecurityToken token);
 public SecurityToken ResolveToken(SecurityKeyIdentifierClause keyIdentifier);
 public bool TryResolveToken(SecurityKeyIdentifierClause keyIdentifierClause, out SecurityToken token);
 public SecurityKey ResolveSecurityKey(SecurityKeyIdentifierClause keyIdentifierClause);
 public bool TryResolveSecurityKey(SecurityKeyIdentifierClause keyIdentifierClause, out SecurityKey key);
}

public abstract class SecurityTokenSerializer
{
 public bool CanReadKeyIdentifier(XmlReader reader);
 public SecurityKeyIdentifier ReadKeyIdentifier(XmlReader reader);
 public SecurityToken ReadToken(XmlReader reader, SecurityTokenResolver outOfBandTokensResolver, SecurityTokenResolver securityHeaderTokensResolver);
 public bool CanReadToken(XmlReader reader);
 public void WriteToken(XmlWriter writer, SecurityToken token);
 public bool CanWriteToken(SecurityToken token);
 public void WriteKeyIdentifier(XmlWriter writer, SecurityKeyIdentifier keyIdentifier);
 public bool CanWriteKeyIdentifier(SecurityKeyIdentifier keyIdentifier);
 public SecurityKeyIdentifierClause ReadKeyIdentifierClause(XmlReader reader);
 public bool CanReadKeyIdentifierClauseCore(XmlReader reader);
 public void WriteKeyIdentifierClause(XmlWriter writer, SecurityKeyIdentifierClause keyIdentifierClause);
 public bool CanWriteKeyIdentifierClause(SecurityKeyIdentifierClause keyIdentifierClause);
 public SecurityKeyIdentifierClause CreateKeyIdentifierClauseFromTokenXml(XmlElement element, SecurityTokenReferenceStyle tokenReferenceStyle);
 public bool TryCreateKeyIdentifierClauseFromTokenXml(XmlElement element, SecurityTokenReferenceStyle tokenReferenceStyle, out SecurityKeyIdentifierClause clause);
}

public abstract class SecurityTokenManager
{
 public abstract SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement requirement);
 public abstract SecurityTokenSerializer CreateSecurityTokenSerializer(string securityVersion);
 public abstract SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver);
}

public interface ISecurityCredentialsManager
{
 public SecurityTokenManager CreateSecurityTokenManager();
}

public class ClientCredentials : ISecurityCredentialsManager, IChannelBehavior, ICloneable
{
 public bool SupportInteractive { get; set; }
 public X509CertificateInitiatorClientCredential ClientCertificate { get; }
 public X509CertificateRecipientClientCredential ServiceCertificate { get; }
 public WindowsClientCredential Windows { get; }
 public UserNamePasswordClientCredential UserName { get; }
 public HttpDigestClientCredential HttpDigest { get; }
 public IssuedTokenClientCredential IssuedToken { get; }
 public PeerCredential Peer { get; }
}

public class ServiceCredentials : ISecurityCredentialsManager, IServiceBehavior, ICloneable
{
 public UserNamePasswordServiceCredential UserNamePasswordAuthentication { get;}
 public X509CertificateInitiatorServiceCredential ClientCertificate { get; }
 public X509CertificateRecipientServiceCredential ServiceCertificate { get; }
 public WindowsServiceCredential WindowsAuthentication { get; }
 public IssuedTokenServiceCredential IssuedTokenAuthentication { get; }
 public PeerCredential Peer { get; }
}

Code Before


                        storeLocation ="CurrentUser"
                      storeName ="TrustedPeople"
                      x509FindType ="FindBySubjectName" />
                        storeLocation ="CurrentUser"
                      storeName ="TrustedPeople"
                      x509FindType ="FindBySubjectName"
                      revocationMode ="Online"
                      trustedStoreLocation ="CurrentUser" />
 
 
                 cacheIssuedTokens ="true" >
   
                    binding ="homeStsBinding" />
   

   
                 behaviorConfiguration ="someBehavior" />
   
           
 




 
 
                        storeLocation ="CurrentUser"
                      storeName ="My"
                      x509FindType ="FindBySubjectName" />
 

Code After

                   supportInteractive="false">
 
 
   
     
     
       
     

   

                        revocationMode="Online"
                    trustedStoreLocation="CurrentUser"
 customCertificateValidatorType="myCustomValidator"/>
 

 
 
                 cacheIssuedTokens="true">
                     binding="homeStsBinding" />
   
                 behaviorConfiguration="someBehavior"/>
   

 

 
   
                            trustedStoreLocation="CurrentUser"/>
   
 





             userNamePasswordValidationMode="MembershipProvider"
           membershipProvider="fooProvider" />
 
                        mapClientCertificateToWindowsAccount="true"/>
 

 
 
 
   
     
   

 

 
   
                            trustedStoreLocation="CurrentUser"/>
   
 

 

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.

Classes derived from SamlSubjectStatement now implement AddClaimsToList instread of GetClaims.

This change effects

OM

Before

class SamlSubjectStatement
{
...
 protected abstract void GetClaims(IList claims);
...
}

public class SamlAttribute
{
 public SamlAttribute();
 public SamlAttribute(string attributeNamespace,
                      string attributeName,
                      IEnumerable attributeValues );
 ...
}

After

class SamlSubjectStatement
{
...
 protected abstract void AddClaimsToList(IList claims);
...
}

public class SamlAttribute
{
 public SamlAttribute();
 public SamlAttribute(string attributeNamespace,
                      string attributeName,
                      IEnumerable attributeValues );
 public SamlAttribute(Claim claim);
}

 

Transactions

 

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

 

System.IO.Log

 

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

 

COM Integration

System.ServiceModel. ComIntegration

 

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

 

SvcUtil

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.
Also, generated clients will by default now determine the value of the session attribute by inspecting the bindings for a given contract and determining if they can all support a session.  If all the bindings can support a session, the session attribute will be set to true, otherwise false.

Type of Origin

System.ServiceModel.Design.WsdlImporter

This change effects

Wire, Generated code