Попытка запустить первый сервис WCF - PullRequest
3 голосов
/ 12 мая 2011

Я пытаюсь запустить свой первый сервис 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) дает тот же результат ....

Еще одна вещь: я понимаю, что такой подход к созданию сервиса не очень хорош ... однако вместо использования инструментов автоматического генерирования кода я хотел бы сначала понять, как создать и запустить сервис из корней и как это сделать с помощью инструментов более высокого уровня ... спасибо

1 Ответ

4 голосов
/ 12 мая 2011

Проблема заключается в том, что вы определили две конечные точки, 'svc' (http) и 'net.tcp: // localhost: 8081 / service1 / tcpsvc' (tcp), а затем попытались запустить хост службы, используятретья конечная точка, которая не определена ни в одной из двух настроенных вами конечных точек.

Я рекомендую удалить код, программно создающий привязки, добавить файл .config в ваш проект, а затем использоватьРедактор конфигурации служб WCF, встроенный в Visual Studio (начиная с 2008 года), который сделает за вас тяжелую работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...