Vorbereitungen für Windows Communication Foundation: Einfachere Migration in der ZukunftAnticipating Adopting the Windows Communication Foundation: Easing Future Migration

Um eine einfachere Migration neuer ASP.NET-Anwendungen in WCF, führen Sie die vorherigen Empfehlungen als auch die folgenden Empfehlungen beachten.To ensure an easier future migration of new ASP.NET applications to WCF, follow the preceding recommendations as well as the following recommendations.

ProtokolleProtocols

Deaktivieren Sie die SOAP 1.2-Unterstützung von ASP.NET 2.0:Disable ASP.NET 2.0’s support for SOAP 1.2:

<configuration>  
     <system.web>  
      <webServices >  
          <protocols>  
           <remove name="HttpSoap12"/>  
          </protocols>    
      </webServices>  
     </system.web>   
</configuration>  

Auf diese Weise ist ratsam, da WCF Nachrichten, die verschiedene Protokolle wie SOAP 1.1 und SOAP 1.2 entsprechen, fahren Sie mit verschiedenen Endpunkten erforderlich sind.Doing so is advisable because WCF requires messages conforming to different protocols, like SOAP 1.1 and SOAP 1.2, to go by using different endpoints. Wenn eine ASP.NET 2.0 Web-Dienst für die Unterstützung von SOAP 1.1 und SOAP 1.2 mit der Standardkonfiguration ist er kann nicht konfiguriert ist vorwärts zu einem einzelnen WCF-Endpunkt an der ursprünglichen Adresse migriert wäre mit der ASP.NET Web kompatibel sein der Dienst vorhandenen Clients.If an ASP.NET 2.0 Web service is configured to support both SOAP 1.1 and SOAP 1.2, which is the default configuration, then it cannot be migrated forward to a single WCF endpoint at the original address that would be certainly be compatible with all of the ASP.NET Web service’s existing clients. Auch das Auswählen von SOAP 1.2 anstelle von 1.1 hat eine stärkere Einschränkung der Clients für den Dienst zur Folge.Also choosing SOAP 1.2 instead of 1.1 will more severely restrict the clientele of the service.

DienstentwicklungService Development

WCF bietet die Möglichkeit zum Definieren von Dienstverträgen durch Anwenden der ServiceContractAttribute auf Schnittstellen oder Klassen.WCF allows you to define service contracts by applying the ServiceContractAttribute either to interfaces or to classes. Es empfiehlt sich, das Attribut auf eine Schnittstelle (und nicht auf eine Klasse) anzuwenden, da hierdurch die Definition eines Vertrags erstellt wird, der von einer Reihe von Klassen auf unterschiedlichste Weise implementiert werden kann.It is recommended to apply the attribute to an interface rather than to a class, because doing so creates a definition of a contract that can be variously implemented by any number of classes. Von ASP.NET 2.0 wird die Option zum Anwenden des WebService-Attributs sowohl für Schnittstellen als auch für Klassen unterstützt.ASP.NET 2.0 supports the option of applying the WebService attribute to interfaces as well as classes. Wie jedoch bereits angesprochen: In ASP.NET 2.0 ist ein Fehler vorhanden, durch den der Namespace-Parameter des WebService-Attributs keine Wirkung zeigt, wenn das Attribut auf eine Schnittstelle (und nicht auf eine Klasse) angewendet wird.However, as mentioned already, there is a defect in ASP.NET 2.0, by which the Namespace parameter of the WebService attribute has no effect when that attribute is applied to an interface rather than a class. Da es in der Regel empfehlenswert, so ändern Sie den Namespace eines Diensts aus der Standardwert ist http://tempuri.org, mit dem Namespace-Parameter von der WebService -Attribut, eine sollten weiterhin definieren ASP.NET-Webdienste durch Anwenden der ServiceContractAttribute Attribut entweder auf Schnittstellen oder Klassen.Since it is generally advisable to modify the namespace of a service from the default value, http://tempuri.org, using the Namespace parameter of the WebService attribute, one should continue defining ASP.NET Web Services by applying the ServiceContractAttribute attribute either to interfaces or to classes.

  • Verwenden Sie in den Methoden zum Definieren dieser Schnittstellen möglichst wenig Code.Have as little code as possible in the methods by which those interfaces are defined. Konfigurieren Sie sie so, dass deren Aufgaben an andere Klassen delegiert werden.Have them delegate their work to other classes. Neue Typen von WCF-Dienste konnten substanziellen Arbeit an diese Klassen dann auch delegieren.New WCF service types could then also delegate their substantive work to those classes.

  • Geben Sie explizite Namen für die Vorgänge eines Diensts an. Verwenden Sie hierfür den MessageName-Parameter des WebMethodAttribute.Provide explicit names for the operations of a service using the MessageName parameter of the WebMethodAttribute.

    [WebMethod(MessageName="ExplicitName")]  
    string Echo(string input);  
    

    Auf diese Weise ist wichtig, da die Standardnamen für Vorgänge in ASP.NET von den Standardnamen durch WCF unterschiedlich sind.Doing so is important, because the default names for operations in ASP.NET are different from the default names supplied by WCF. Durch Angeben expliziter Namen müssen Sie sich nicht auf die Standardnamen verlassen.By providing explicit names, you avoid relying on the default ones.

  • Da WCF keine implementierende Vorgänge mit polymorphen Methoden unterstützt ASP.NET Web-Dienstvorgängen nicht mit polymorphen Methoden implementiert werden.Do not implement ASP.NET Web service operations with polymorphic methods, because WCF does not support implementing operations with polymorphic methods.

  • Verwenden Sie SoapDocumentMethodAttribute, um explizite Werte für SOAPAction-HTTP-Header anzugeben, durch die HTTP-Anforderungen an Methoden geroutet werden.Use the SoapDocumentMethodAttribute to provide explicit values for the SOAPAction HTTP headers by which HTTP requests will be routed to methods.

    [WebMethod]  
    [SoapDocumentMethod(RequestElementName="ExplicitAction")]  
    string Echo(string input);  
    

    Bei diesem Ansatz wird umgehen, müssen die Standardeinstellung von ASP.NET und WCF übereinstimmen verwendeten SOAPAction-Werte abhängig.Taking this approach will circumvent having to rely on the default SOAPAction values used by ASP.NET and WCF being the same.

  • Verwenden Sie möglichst keine SOAP-Erweiterungen.Avoid using SOAP extensions. Überprüfen Sie SOAP-Erweiterungen erforderlich sind, ob für die sie in Betracht gezogen werden eine Funktion dient, die bereits von WCF bereitgestellt wird.If SOAP extensions are required, then determine whether the purpose for which they are being considered is a feature that is already provided by WCF. Wenn dies tatsächlich der Fall ist, überprüfen Sie die Wahl, WCF nicht sofort zu verwenden.If that is indeed the case, then reconsider the choice to not adopt WCF right away.

ZustandsverwaltungState Management

Verzichten Sie nach Möglichkeit darauf, Zustände in Diensten verwalten zu müssen.Avoid having to maintain state in services. Nicht nur ist Zustandsverwaltung tendenziell die Skalierbarkeit einer Anwendung beeinträchtigen, sondern der Zustand schlüsselverwaltungsmechanismen von ASP.NET und WCF sehr unterschiedlich sind, obwohl WCF das ASP.NET Mechanismen im ASP.NET-Kompatibilitätsmodus unterstützt wird.Not only does maintaining state tend to compromise the scalability of an application, but the state management mechanisms of ASP.NET and WCF are very different, although WCF does support the ASP.NET mechanisms in ASP.NET compatibility mode.

AusnahmebehandlungException Handling

Entwerfen Sie beim Ausarbeiten der Strukturen von Datentypen, die von einem Dienst gesendet und empfangen werden sollen, auch Strukturen für die verschiedenen Ausnahmetypen, die in einem an einen Client zu übermittelnden Dienst auftreten können.In designing the structures of the data types to be sent and received by a service, also design structures to represent the various types of exceptions that might occur within a service that one might wish to convey to a client.

[Serializable]  
[XmlRoot(  
     Namespace="ExplicitNamespace", IsNullable=true)]  
    public partial class AnticipatedException {  

     private string anticipatedExceptionInformationField;  

     public string AnticipatedExceptionInformation {  
      get {  
          return this.anticipatedExceptionInformationField;  
          }  
      set {  
          this.anticipatedExceptionInformationField = value;  
          }  
     }  
}  

Konfigurieren Sie Klassen dieser Art so, dass sie eigenständig zu XML serialisiert werden können:Give such classes the ability to serialize themselves to XML:

public XmlNode ToXML()  
{  
     XmlSerializer serializer = new XmlSerializer(  
      typeof(AnticipatedException));  
     MemoryStream memoryStream = new MemoryStream();  
     XmlTextWriter writer = new XmlTextWriter(  
     memoryStream, UnicodeEncoding.UTF8);  
     serializer.Serialize(writer, this);  
     XmlDocument document = new XmlDocument();  
     document.LoadXml(new string(  
     UnicodeEncoding.UTF8.GetChars(  
     memoryStream.GetBuffer())).Trim());  
    return document.DocumentElement;  
}  

Die Klassen können anschließend zum Angeben der Details für explizit ausgelöste SoapException-Instanzen verwendet werden:The classes can then be used to provide the details for explicitly thrown SoapException instances:

AnctipatedException exception = new AnticipatedException();  
exception.AnticipatedExceptionInformation = "…";  
throw new SoapException(  
     "Fault occurred",  
     SoapException.ClientFaultCode,  
     Context.Request.Url.AbsoluteUri,  
     exception.ToXML());  

Diese Ausnahmeklassen werden mit den WCF sofort verwendbareFaultException<TDetail> Klasse eine neue ausgelöst werden soll FaultException<AnticipatedException>(anticipatedException);These exception classes will be readily reusable with the WCFFaultException<TDetail> class to throw a new FaultException<AnticipatedException>(anticipatedException);

SicherheitSecurity

Der folgende Abschnitt enthält einige Sicherheitsempfehlungen:The following are some security recommendations.

  • Vermeiden Sie mithilfe von ASP.NET 2.0-Profile, da durch deren Verwendung die Verwendung des ASP.NET-Integrationsmodus eingeschränkt wird, wenn der Dienst in WCF migriert wurde.Avoid using ASP.NET 2.0 Profiles, as using them would restrict the use of ASP.NET Integration Mode if the service was migrated to WCF.

  • Vermeiden Sie die Verwendung von ACLs zum Steuern des Zugriffs auf Dienste, als ASP.NET Web Services unterstützt ACLs unter Verwendung von Internet Information Services (IIS), WCF nicht der Fall, da ASP.NET-Webdienste hängen IIS zum Hosten von WCF nicht unbedingt in IIS gehostet werden.Avoid using ACLs to control access to services, as ASP.NET Web services supports ACLs using Internet Information Services (IIS), WCF does not—because ASP.NET Web services depend on IIS for hosting, and WCF does not necessarily have to be hosted in IIS.

  • Verwenden Sie ASP.NET 2.0-Rollenanbieter zum Autorisieren des Zugriffs auf die Ressource eines Diensts.Do consider using ASP.NET 2.0 Role Providers for authorizing access to the resources of a service.

Siehe auchSee Also

Vorbereitungen für Windows Communication Foundation: Einfachere Integration in der ZukunftAnticipating Adopting the Windows Communication Foundation: Easing Future Integration