Udostępnij za pośrednictwem


Prognozowanie wdrożeń programu Windows Communication Foundation: ułatwianie migracji w przyszłości

Aby zapewnić łatwiejszą przyszłą migrację nowych aplikacji ASP.NET do usługi WCF, postępuj zgodnie z poprzednimi zaleceniami, a także poniższymi zaleceniami.

Protokoły

Wyłącz obsługę protokołu SOAP 1.2 ASP.NET 2.0:

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

Jest to zalecane, ponieważ program WCF wymaga, aby komunikaty były zgodne z różnymi protokołami, takimi jak SOAP 1.1 i SOAP 1.2, aby przejść przy użyciu różnych punktów końcowych. Jeśli usługa sieci Web ASP.NET 2.0 jest skonfigurowana do obsługi zarówno protokołu SOAP 1.1, jak i protokołu SOAP 1.2, która jest konfiguracją domyślną, nie można przeprowadzić migracji do pojedynczego punktu końcowego programu WCF pod oryginalnym adresem, który z pewnością będzie zgodny ze wszystkimi istniejącymi klientami usługi sieci Web ASP.NET. Wybranie również protokołu SOAP 1.2 zamiast 1.1 spowoduje poważniejsze ograniczenie klienta usługi.

Programowanie usług

Program WCF umożliwia definiowanie kontraktów usług przez zastosowanie ServiceContractAttribute elementu do interfejsów lub klas. Zaleca się zastosowanie atrybutu do interfejsu, a nie do klasy, ponieważ w ten sposób tworzy definicję kontraktu, który może być w różny sposób implementowany przez dowolną liczbę klas. ASP.NET 2.0 obsługuje opcję stosowania atrybutu WebService do interfejsów, a także klas. Jednak, jak wspomniano już, istnieje usterka w ASP.NET 2.0, za pomocą której parametr przestrzeni nazw atrybutu WebService nie ma wpływu, gdy ten atrybut jest stosowany do interfejsu, a nie klasy. Ponieważ ogólnie zaleca się zmodyfikowanie przestrzeni nazw usługi z wartości domyślnej, http://tempuri.orgprzy użyciu parametru Przestrzeni nazw atrybutu WebService , należy kontynuować definiowanie ASP.NET usług sieci Web przez zastosowanie atrybutu ServiceContractAttribute do interfejsów lub klas.

  • W metodach, za pomocą których zdefiniowano te interfejsy, należy jak najmniej kodu. Niech delegują swoją pracę do innych klas. Nowe typy usług WCF mogą następnie delegować swoją merytoryczną pracę do tych klas.

  • Podaj jawne nazwy operacji usługi przy użyciu MessageName parametru WebMethodAttribute.

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

    Jest to ważne, ponieważ domyślne nazwy operacji w ASP.NET różnią się od domyślnych nazw dostarczonych przez program WCF. Podając jawne nazwy, należy unikać polegania na tych domyślnych.

  • Nie implementuj ASP.NET operacji usługi sieci Web za pomocą metod polimorficznych, ponieważ program WCF nie obsługuje implementowania operacji za pomocą metod polimorficznych.

  • Użyj elementu , SoapDocumentMethodAttribute aby podać jawne wartości nagłówków HTTP protokołu SOAPAction, za pomocą których żądania HTTP będą kierowane do metod.

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

    Takie podejście spowoduje obejście konieczności polegania na domyślnych wartościach SOAPAction używanych przez ASP.NET i WCF, które są takie same.

  • Unikaj używania rozszerzeń protokołu SOAP. Jeśli rozszerzenia protokołu SOAP są wymagane, określ, czy cel, dla którego są one brane pod uwagę, jest funkcją, która jest już udostępniana przez usługę WCF. Jeśli tak naprawdę tak jest, rozważ ponownie wybór, aby nie przyjąć od razu programu WCF.

Zarządzanie stanem

Unikaj konieczności utrzymania stanu w usługach. Nie tylko utrzymanie stanu ma tendencję do naruszenia skalowalności aplikacji, ale mechanizmy zarządzania stanem ASP.NET i WCF są bardzo różne, chociaż WCF obsługuje mechanizmy ASP.NET w trybie zgodności ASP.NET.

Obsługa wyjątków

Podczas projektowania struktur typów danych, które mają być wysyłane i odbierane przez usługę, również struktury projektowe reprezentujące różne typy wyjątków, które mogą wystąpić w usłudze, którą można przekazać klientowi.

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

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

Nadaj takim klasom możliwość serializacji siebie do kodu 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;  
}  

Klasy mogą następnie służyć do podawania szczegółów jawnie zgłaszanych SoapException wystąpień:

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

Te klasy wyjątków będą łatwo wielokrotnego użytku z klasą WCF FaultException<TDetail> w celu zgłoszenia nowego FaultException<AnticipatedException>(anticipatedException);

Zabezpieczenia

Poniżej przedstawiono niektóre zalecenia dotyczące zabezpieczeń.

  • Unikaj używania profilów ASP.NET 2.0, ponieważ użycie ich ogranicza korzystanie z trybu integracji ASP.NET, jeśli usługa została zmigrowana do usługi WCF.

  • Należy unikać używania list ACL do kontrolowania dostępu do usług, ponieważ usługi sieci Web ASP.NET obsługują listy ACL przy użyciu internetowych usług informacyjnych (IIS), program WCF nie obsługuje — ponieważ ASP.NET usługi sieci Web zależą od usług IIS do hostowania, a usługa WCF nie musi być hostowana w usługach IIS.

  • Rozważ użycie dostawców ról ASP.NET 2.0 w celu autoryzowania dostępu do zasobów usługi.

Zobacz też