Цитата(starostin @ 16.1.2011, 22:14 ) | Ещё забыл уточнить, правда не уверен, что это играет какую то роль, я сервис не размещал в iis на хосте запускаю
|
если вы пытаетесь запустить его из asp.net dev server то у вас ничего не получится - т.к. данный сервер работает (биндится) только на локалхост. И плевать он хотел (впрочем, как и IIS) на ваши baseAddress-ы.
Итак, для хостинга WCF существует три метода: IIS, WAS (windows activation service) и self-hosting. Asp.net dev server по сути аналогичен урезаному IIS-у и кроме всего прочего биндится только на локалхост - т.е. его нельзя использовать (без бубна) для публикации сервиса в сети. Посему это не рассматриваем.
IIS Хостинг в IIS с т.з. адресации сам говорит приложению какой порт и базовый адресс использовать (это вы задаете в настройках IIS). Посему он попросту плевать хотел на указание baseAddress-ов и самостоятельно вычисляет где сервис расположен. Кроме того, IIS обычно хочет .svc файл чтобы был с простейшим содержанием вроде:
| Код | <%@ ServiceHost Language="C#" Debug="true" Service="WcfService1.Service1" CodeBehind="Service1.svc.cs" %>
|
либо, если .svc файла нет, то надо прописывать роуты в global.asax как для обычного web приложения... Можно, конечно, попробывать указать фабрику Factory="MyApp.MyServiceHostFactory", но я не думаю что это что-то даст на самом деле.
WAS проще почитать в msdn
self-hosting Вот тут вы ничем не ограничены. Пишите нечто вроде:
| Код | static void Main(string[] args) { var baseAddress = new Uri("http://0.0.0.0:1331/"); // Create the ServiceHost. using (ServiceHost host = new ServiceHost(typeof(Service1), baseAddress)) { // Enable metadata publishing. ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; host.Description.Behaviors.Add(smb);
// Open the ServiceHost to start listening for messages. Since // no endpoints are explicitly configured, the runtime will create // one endpoint per base address for each service contract implemented // by the service. host.Open();
Console.WriteLine("The service is ready at {0}", baseAddress); Console.WriteLine("Press <Enter> to stop the service."); Console.ReadLine();
// Close the ServiceHost. host.Close(); }
|
и вуаля! всё работает. |