Dovendo gestire le chiamate ad un numero elevato di servizi .asmx (sia che si chiamino da asp.net che da smartclient) nasce il problema di come gestire i casi in cui uno schema è condiviso da più servizi.
Per i casi 'semplici' con l'utilizzo del "add web references" di visual studio 2005 si ottiene un proxy che ingloba i tipi esposti da quel servizio. Avremo quindi inclusi sia i tipi semplici che 'entity object' e DataSet.
Nel primo caso sarà aggiunta la definizione nel file Reference.cs
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.26")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://myNamespace/")]
public partial class SalesOrderDetail {
private int salesOrderIdField;
private decimal unitPriceField;
private string carrierTrackingNumberField;
private System.DateTime modifiedDateField;
///
public int SalesOrderId {
get {
return this.salesOrderIdField;
}
set {
this.salesOrderIdField = value;
}
}
///
public decimal UnitPrice {
get {
return this.unitPriceField;
}
set {
this.unitPriceField = value;
}
}
///
public string CarrierTrackingNumber {
get {
return this.carrierTrackingNumberField;
}
set {
this.carrierTrackingNumberField = value;
}
}
///
public System.DateTime ModifiedDate {
get {
return this.modifiedDateField;
}
set {
this.modifiedDateField = value;
}
}
}
nel secondo oltre che al codice (un tipo che eredita da System.Data.DataSet) avremo anche l'xsd corrispondente al typed dataset.
La classe generata ha un namespace in cui 'vivono' i tipi.
Di default il namespace è composto dal namespace di default dell'applicazione (impostato nelle properties del progetto nel tab "Application") con il nome impostato in fase di "add web reference" (che di default è localhost).
Tale default può essere modificato andando a impostare la proprietà "Custom Tool Namespace" sul file .map.
Nei casi più complessi può capitare che un tipo sia condiviso da più asmx magari in progetti diversi.
Per poter gestire al meglio questo scenario magari avremo messo i tipi condivisi in una o più library aggiunta come reference ai progetti.
Per il meccanismo sopra descritto ogni volta che aggiungiamo un servizio al nostro client viene generato un nuovo proxy.
Fino alla versione 2.0 del framework le possibili soluzioni (che mi vengono in mente) erano lo scordarsi l'add web reference (e farsi qualcosa di custom per portarsi a spasso i tipi) oppure impostare lo stesso namespace per i proxy generati e togliere a mano i tipi ridondanti (operazione che bisognava ripetere ogni volta che si faceva una "update web reference").
Dalla 2.0 è stato aggiunto il supporto per questi scenari tramite lo switch /sharetypes del wsdl.exe.
Specificando i servizi che si vogliono utilizzare con lo switch impostato verrà generato un unico proxy che mette a fattor comune i tipi uguali (the namespace, name, and wire signature must be identical).
C:\cf3 >wsdl /sharetypes http://localhost:1032/SimpleObject/Service1.asmx http://localhost:1056/SimpleObject2/Service2.asmx /namespace:MyClientNamespace.MyObjects
Microsoft (R) Web Services Description Language Utility
[Microsoft (R) .NET Framework, Version 2.0.50727.26]
Copyright (C) Microsoft Corporation. All rights reserved.
Writing file 'C:.cs'.
(che io sappia ndr)Il supporto è disponibile attualmente solo con wsdl.exe, per cui per poterlo utilizzare dal vs2005 è necessario un po' di manovre con gli add-in o con qualche macro.
L'idea è di ciclare, ogni volta che viene richiesta una "update web reference", su tutte le Web References.
Per ogni reference prendere l'url, aggiungerlo alla comand line di wsdl.exe, cancellare i files sottostanti (*.map, xsd, wsdl, disco) eseguire il comando e prendersi la classe generata.
Disclaimer:
questa soluzione non è stata testata in maniera 'esaustiva' (come peraltro si desume dal progetto di esempio).
Viste le lamentele sul formato del mio ultimo post (come potete vedere) mi sono munito di IMHO.
Qualcuno ha idea del perchè in fase di aggiunta immagini clickando sul tasto browse mi becco
---------------------------
Microsoft Internet Explorer
---------------------------
An error has occurred in this dialog.
Error: 73
Object doesn't support this property or method
---------------------------
OK
---------------------------
Riferimenti:
http://blogs.thinktecture.com/cweyer/archive/2004/08/11/212843.aspx