Wie Sie programmgesteuert erstellen eines WCF-Dienst und die zugehörigen Metadaten auf der gleichen URL
TL;DR
Ich würde alle drei Dinge("Sie haben eine web-service-Seite", WSDL-Seite und der eigentlichen web service) auf die gleiche URL, ähnlich wie ein WCF-Dienst-Projekt erstellt, die in einem eigenständigen WebService-Anwendung.
Arbeite ich zum erstellen von WCF-Endpunkte programmatisch und bekam das meiste zusammen. Die Letzte Sache ist, dass ich kann nicht get Sie die Metadaten-URL die gleiche ist wie die Dienst-URL. Ich weiß, das sollte möglich sein, wie Sie können services anlegen möchten, die von Visual Studio.
Was passiert ist, ich kann surfen WSDL im browser, ich kann hinzufügen, dass es als web-Verweis kann ich aber nicht aufrufen, es aus dem neu erstellten Projekt. Wenn ich entfernen Sie die beiden freundlichen Seite und wsdl-Seiten, ich kann den Dienst aufzurufen.
Unten ist der code, den ich verwende.
class Program
{
private static ManualResetEvent _ResetEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
Console.TreatControlCAsInput = true;
var serviceUrl = "Fibonacci.svc";
new Thread(() =>
{
var baseUri = new Uri("http://ws.test.com");
var serviceUri = new Uri(baseUri, serviceUrl);
BasicHttpBinding binding = new BasicHttpBinding();
using (var host = new ServiceHost(typeof(Fibonacci), new[] { baseUri }))
{
host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true, HttpGetUrl = new Uri(baseUri, serviceUrl) });
host.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;
host.Description.Behaviors.Find<ServiceDebugBehavior>().HttpHelpPageUrl = serviceUri;
host.AddServiceEndpoint(typeof(IFibonacci), binding, serviceUri);
Console.WriteLine("Started service on cotnract {0}, ready for anything", typeof(IFibonacci).FullName);
host.Open();
_ResetEvent.WaitOne();
}
}).Start();
while (true)
{
var cki = Console.ReadKey(true);
if (cki.Key == ConsoleKey.C && (cki.Modifiers & ConsoleModifiers.Control) != 0)
{
_ResetEvent.Set();
break;
}
}
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellt sich heraus, dass die Lösung einfach ist. Die Dokumentation für HttpGetUrl ist etwas schwammig, im Grunde, um sich alle drei arbeiten die gleiche URL, die Sie brauchen, um das
ServiceHost
mit der vollständige URL der service und dann nur einstellenServiceMetaBaseBehaviour.HttpGetEnable
zutrue
.Entsprechende code ist unten.
Mit freundlicher Genehmigung von Artikel in InfoWorld, siehe 4. Zeile für die alternative, umweltfreundlichere Methode, um anzugeben, mex-Endpunkt, die vermeidet, dass jede URL, die oben erwähnten Probleme. Dies ist nützlich, wenn der Dienst stellt Endpunkten mit anderen Bindungen (z.B. netTcp):
(mit Entschuldigung an diejenigen, die allergisch auf VB)