Ho avuto lo stesso problema, per cui volevo un test harness per puntare a un paio di servizi. Ogni servizio avrebbe dati in comune in comune.
Che cosa deve essere fatto:
- Usa svcutil con/t: i metadati su ogni URL.
- rinominare tutti i file generati con qualcosa di unico per il servizio (ad esempio, Rinomina lala.xsd a 1_lala.xsd)
- Copiare tutti i file generati da una singola posizione
- Usa svcutil con * .xsd .wsdl/out : output.cs/namespace:, MySpecialNamespace per generare TUTTI i contratti di servizio e i contratti di dati in un singolo file.
Se si vuole essere furbo: utilizzare il seguente modello T4:
<#@ template language="C#v4.0" hostspecific="True"#>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.IO" #>
<#=GetGeneratedCode(
"http://localhost/Service/Service1.svc",
"http://localhost/Service/Service2.svc",
"http://localhost/Service/Service3.svc",
"http://localhost/Service/Service4.svc"
)#>
<#+
const string _svcutil = @"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\svcutil.exe";
private string GetGeneratedCode(params string[] urls)
{
var tmp = GetTemporaryDirectory();
foreach (var url in urls)
{
GetMetadata(url, tmp);
}
RunSvcutil(tmp, "*.wsdl *.xsd /out:output.cs /namespace:*," + Path.GetFileNameWithoutExtension(Host.TemplateFile));
var result = File.ReadAllText(Path.Combine(tmp, "output.cs"));
return result;
}
private static void RunSvcutil(string workingFolder, string arguments)
{
var processInfo = new ProcessStartInfo(_svcutil);
processInfo.Arguments = arguments;
processInfo.WorkingDirectory = workingFolder;
var p = Process.Start(processInfo);
p.WaitForExit();
}
private static void GetMetadata(string url, string destination)
{
var workingFolder = GetTemporaryDirectory();
RunSvcutil(workingFolder, string.Format("/t:metadata \"{0}\"", url));
foreach (var filename in Directory.GetFiles(workingFolder))
{
File.Copy(filename, Path.Combine(destination, Path.GetFileNameWithoutExtension(url) + "_" + Path.GetFileName(filename)));
}
}
private static string GetTemporaryDirectory()
{
string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
Directory.CreateDirectory(tempDirectory);
return tempDirectory;
}
#>
possibile duplicato del [ "riuso tipi esistenti" viene ignorata quando si aggiunge un riferimento al servizio] (http://stackoverflow.com/questions/134064/reuse-existing-types-is-ignored-when-adding-a-service-reference) –