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;
            }
        }

    }
}
InformationsquelleAutor Igor Zevaka | 2011-05-06
Schreibe einen Kommentar