Я пытаюсь запустить свой первый сервис WCF.
Хорошо, я хочу отметить, что я полностью понял архитектуру и основы WCF (ABC: привязка адресов и контракт = конечная точка). Кроме того, я понял многие элементы философии WCF, поэтому я не совсем новичок ...
Однако, если оставить в стороне теорию, реальные проблемы возникают, когда кто-то возлагает руки на реальные вещи ...
У меня есть три файла:
Файл IService1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
/// <summary>
/// This is the interface that specifies contract for the Sevice1 of this service application.
/// In this file the interface is specified in order to set the service operations that can be invoked by requestors.
/// </summary>
namespace EchoWcfLibrary {
/// <summary>
/// The interface specifies for those classes implementing it (services), the operation that the service will expose.
/// </summary>
[ServiceContract]
public interface IService1 {
// This does not use serialization (implicit serialization in considered: base types used).
[OperationContract]
string GetData(int value);
// This uses data contracts and serialization.
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
/// <summary>
/// The following class defines data contract for those operations managing with non primitive types and, for this reason, needing serialization support (explicit, not implicit)
/// </summary>
[DataContract]
public class CompositeType {
// Members not serialized
bool boolValue = true;
string stringValue = "Hello ";
// Serialized
[DataMember]
public bool BoolValue {
get { return boolValue; }
set { boolValue = value; }
}
// Serialized
[DataMember]
public string StringValue {
get { return stringValue; }
set { stringValue = value; }
}
}
}
Файл Service1.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
/// <summary>
/// This is the service host implementation. A class implementing the service is specified.
/// </summary>
namespace EchoWcfLibrary {
/// <summary>
/// This class implements the IService1 service.
/// </summary>
public class Service1 : IService1 {
// One operation.
public string GetData(int value) {
return string.Format("You entered: {0}", value);
}
// The other operation.
public CompositeType GetDataUsingDataContract(CompositeType composite) {
if (composite == null) {
throw new ArgumentNullException("composite");
}
if (composite.BoolValue) {
composite.StringValue += "Suffix";
}
return composite;
}
}
}
Эти файлы находятся внутри проекта под названием EchoWcfLibrary
А главное: Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using EchoWcfLibrary;
namespace WcfServiceApplication {
public static class Program {
static void Main(string[] args) {
// Setting endpoints and setting the service to start properly.
// Base address specified: http://localhost:8080/service1
using (ServiceHost host = new ServiceHost(typeof(Service1), new Uri("http://localhost:8080/service1"))) {
host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "svc");
host.AddServiceEndpoint(typeof(IService1), new NetTcpBinding(), "net.tcp://localhost:8081/service1/tcpsvc");
host.Open();
System.Threading.Thread.Sleep(1000000);
host.Close();
}
}
}
}
Этот последний файл находится в отдельном проекте под названием WcfServiceApplication
Два проекта существуют в одном решении.
WcfServiceApplication
имеет, конечно, ссылку на другой проект.
Я хотел бы запустить этот сервис, который, как вы можете видеть, тот, который Visual Studio помещает в шаблон библиотеки WCF.
Ну, я пытался запустить его первый раз, и у меня были некоторые проблемы с резервированием пространства имен http, я исправил это с помощью netsh и добавил явное резервирование для моего пользователя и для указанных пространств имен http.
Однако, с чем я сталкиваюсь, это следующее: Хост-приложение WCF, которое является небольшим, очень полезным, показывает текущие размещенные сервисы. Размещен только один сервис: мой, но его статус остановлен, и он говорит мне, в окне описания, что НЕТ ENDPOINT было определено !!!
Но я определил их в Program.cs
... Я не понимаю ...
Что я делаю не так?
Thankyou
PS
Обратите внимание, что даже определение только host.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "svc")
(без конечной точки tcp) дает тот же результат ....
Еще одна вещь: я понимаю, что такой подход к созданию сервиса не очень хорош ... однако вместо использования инструментов автоматического генерирования кода я хотел бы сначала понять, как создать и запустить сервис из корней и как это сделать с помощью инструментов более высокого уровня ... спасибо