TL;DR
I would to run all three things("You have created a web service" page, WSDL page and actual web service) on the same URL, similarly to a WCF service project created in a standalone WebService application.
I am working on creating WCF endpoints programatically and got most of it together. The last thing is that I can't get the metadata URL to be the same as the service URL. I know this should be possible as you can create services like that from Visual Studio.
What happens is I can browse WSDL in the browser, I can add it as a web reference but I can't invoke it from the newly created project. If I remove both friendly page and wsdl pages, i can invoke the service.
Below is the code that I am using.
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;
}
}
}
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…