Как я могу создать приложение службы WCF в Visual Studio, которое НЕ использует веб-сервер - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть простая задача: программа (исполняемая) должна вызывать функцию другой программы (также исполняемой) с некоторыми параметрами. Программа А должна быть запущена, вызвать функцию и затем завершиться. Программа B является устаревшей программой, которая имеет GUI и работает непрерывно. Обе программы работают на одном Windows P C и используют. NET Framework. У меня нет опыта в веб-разработке, и программа B не должна работать как веб-сервис! Именованные каналы кажутся хорошим вариантом.

Я исследовал, каким будет лучший метод, и хотел попробовать WCF. В документации утверждается, что «конечная точка службы может быть частью постоянно доступной службы, размещенной в IIS, или это может быть служба, размещенная в приложении». Исходя из этого, я понимаю, что могу запускать Программу B как службу без размещения веб-сервера.

Однако все, что я вижу в Visual Studio, предполагает, что я хочу запустить сервер. Я хочу создать новый проект WCF в Visual Studio, единственными вариантами являются библиотека или «Проект для создания приложения-службы WCF, размещенный в IIS / WAS». После того, как я создал указанный проект, отладчик хочет, чтобы я выбрал браузер для размещения службы.

В другом StackOverflow topi c популярным предложением было использование этого веб-сайта в качестве руководства и просто удалите ссылки http, так как руководство предназначено как для именованных каналов, так и для http. Еще один признак того, что это должно быть возможно.

Так может ли кто-нибудь указать мне правильное направление? Что мне не хватает? Как я могу использовать WCF, не имея ничего общего с веб-разработкой?

1 Ответ

1 голос
/ 04 мая 2020

Вы уже в пути, достаточно разместить веб-сервис в Программе B без указания веб-сервера. это называется самодостаточным WCF. Как вы упомянули по ссылке, класс хоста Service используется для размещения сервиса WCF, что означает, что мы можем разместить сервис в Console/Winform и т. Д.
Вот пример размещения сервиса в Приложение Winform.

public partial class Form1 : Form
    {
        ServiceHost serviceHost = null;
        public Form1()
        {
            InitializeComponent();
            Uri uri = new Uri("http://localhost:9009");
            BasicHttpBinding binding = new BasicHttpBinding();
            serviceHost = new ServiceHost(typeof(MyService), uri);
            serviceHost.AddServiceEndpoint(typeof(IService), binding, "");
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior()
            {
                HttpGetEnabled = true
            };
            serviceHost.Description.Behaviors.Add(smb);
            System.ServiceModel.Channels.Binding mexbinding = MetadataExchangeBindings.CreateMexHttpBinding();
            serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), mexbinding, "mex");
            serviceHost.Open();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            if (serviceHost.State==CommunicationState.Opened)
            {
                this.label1.Text = "Service is running";
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serviceHost.State==CommunicationState.Opened&&serviceHost.State!=CommunicationState.Closed)
            {
                serviceHost.Close();
            }
        }
    }
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        string Test();
    }
    public class MyService:IService
    {
        public string Test()
        {
            return DateTime.Now.ToLongTimeString();
        }
    }

После этого мы можем использовать его с помощью клиентского прокси.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/accessing-services-using-a-wcf-client
Не стесняйтесь, дайте мне знать, если есть что-то Я могу помочь с.

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