Očekávání přechodu na Windows Communication Foundation: Usnadnění budoucí migrace
Pokud chcete zajistit snadnější budoucí migraci nových ASP.NET aplikací do WCF, postupujte podle předchozích doporučení a také následujících doporučení.
Protokoly
Zakažte podporu protokolu SOAP 1.2 pro ASP.NET 2.0:
<configuration>
<system.web>
<webServices >
<protocols>
<remove name="HttpSoap12"/>
</protocols>
</webServices>
</system.web>
</configuration>
Je to vhodné, protože WCF vyžaduje, aby zprávy odpovídaly různým protokolům, jako je SOAP 1.1 a SOAP 1.2, pro přechod pomocí různých koncových bodů. Pokud je webová služba ASP.NET 2.0 nakonfigurovaná tak, aby podporovala protokol SOAP 1.1 i SOAP 1.2, což je výchozí konfigurace, nelze ji migrovat do jednoho koncového bodu WCF na původní adrese, která by byla jistě kompatibilní se všemi stávajícími klienty ASP.NET webové služby. Volba protokolu SOAP 1.2 místo verze 1.1 také výrazně omezí klientelu služby.
Vývoj služeb
WCF umožňuje definovat kontrakty služeb použitím ServiceContractAttribute rozhraní nebo tříd. Doporučuje se použít atribut na rozhraní spíše než na třídu, protože tím se vytvoří definice kontraktu, který lze různě implementovat libovolným počtem tříd. ASP.NET 2.0 podporuje možnost použití atributu WebService u rozhraní i tříd. Jak už však bylo zmíněno, v ASP.NET 2.0 došlo k vadě, kterou parametr Oboru názvů atributu WebService nemá žádný vliv, pokud se tento atribut použije na rozhraní místo třídy. Vzhledem k tomu, že je obecně vhodné upravit obor názvů služby z výchozí hodnoty, http://tempuri.org
pomocí parametru WebService Namespace atributu, jeden by měl pokračovat v definování ASP.NET webové služby použitím ServiceContractAttribute atributu buď na rozhraní, nebo na třídy.
Mít co nejmenší kód v metodách, pomocí kterých jsou tato rozhraní definována. Nechte je delegovat svou práci na jiné předměty. Nové typy služeb WCF pak mohou také delegovat jejich hmotnou práci na tyto třídy.
Zadejte explicitní názvy operací služby pomocí
MessageName
parametru WebMethodAttribute.[WebMethod(MessageName="ExplicitName")] string Echo(string input);
Je to důležité, protože výchozí názvy operací v ASP.NET se liší od výchozích názvů poskytovaných WCF. Zadáním explicitních názvů se nemusíte spoléhat na výchozí názvy.
Neimplementujte ASP.NET operace webové služby s polymorfními metodami, protože WCF nepodporuje implementaci operací s polymorfními metodami.
SoapDocumentMethodAttribute Použijte k zadání explicitních hodnot pro hlavičky HTTP SOAPAction, pomocí kterých budou požadavky HTTP směrovány do metod.
[WebMethod] [SoapDocumentMethod(RequestElementName="ExplicitAction")] string Echo(string input);
Tento přístup bude obcházet tak, že bude nutné spoléhat na výchozí hodnoty SOAPAction používané ASP.NET a WCF, které jsou stejné.
Vyhněte se používání rozšíření SOAP. Pokud jsou požadována rozšíření SOAP, určete, zda je účelem, pro který se považují, je funkce, která je již poskytována WCF. Pokud tomu tak skutečně je, znovu rozmyslete volbu, že nebudete hned přijímat WCF.
Správa stavu
Vyhněte se udržování stavu ve službách. Údržba stavu má tendenci ohrozit škálovatelnost aplikace, ale mechanismy správy stavu ASP.NET a WCF jsou velmi odlišné, i když WCF podporuje mechanismy ASP.NET v režimu kompatibility ASP.NET.
Zpracování výjimek
Při navrhování struktur datových typů, které mají být odesílány a přijímány službou, se také navrhují struktury, které představují různé typy výjimek, ke kterým může dojít v rámci služby, kterou může chtít předat klientovi.
[Serializable]
[XmlRoot(Namespace="ExplicitNamespace", IsNullable=true)]
public partial class AnticipatedException
{
private string anticipatedExceptionInformationField;
public string AnticipatedExceptionInformation
{
get {
return this.anticipatedExceptionInformationField;
}
set {
this.anticipatedExceptionInformationField = value;
}
}
}
Dejte těmto třídám možnost serializovat sebe do 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;
}
Třídy se pak dají použít k poskytnutí podrobností o explicitně vyvolaných SoapException instancích:
AnticipatedException exception = new AnticipatedException();
exception.AnticipatedExceptionInformation = "…";
throw new SoapException(
"Fault occurred",
SoapException.ClientFaultCode,
Context.Request.Url.AbsoluteUri,
exception.ToXML());
Tyto třídy výjimek budou snadno opakovaně použitelné s třídou WCF FaultException<TDetail> za účelem vyvolání nové třídy. FaultException<AnticipatedException>(anticipatedException);
Zabezpečení
Tady jsou některá doporučení zabezpečení.
Nepoužívejte ASP.NET profily 2.0, protože jejich použití by omezilo použití režimu integrace ASP.NET, pokud byla služba migrována do WCF.
Nepoužívejte seznamy ACL k řízení přístupu ke službám, protože webové služby ASP.NET podporují seznamy ACL pomocí Internetová informační služba (IIS), WCF ne – protože ASP.NET webové služby závisí na službě IIS pro hostování a WCF nemusí být hostované ve službě IIS.
Zvažte použití ASP.NET 2.0 zprostředkovatelů rolí k autorizaci přístupu k prostředkům služby.