C # «Регистрация для URI уже существует» - PullRequest
0 голосов
/ 10 июля 2019

В настоящее время я работаю над проектом "server-app" / "client-app", целью которого является получение некоторых данных из приложения server в клиентское приложение.Я попробовал это с подходом WCF, но так как я никогда не работал с WCF, это не простая задача для меня.

Итак, я уже настроил два приложения в одном решении - два разных проекта.Первый проект содержит серверное приложение (TRunnerServer), а второй - клиентское приложение (TRunnerClient).

Я настроил интерфейс для службы следующим образом (в ServerApp MainWindowViewModel.cs):

[ServiceContract]
public interface ITRunnerService
{
    [OperationContract]
    ObservableCollection<Program> GetProgramList();
}

Затем я добавил метод в класс и т. Д., Например:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
internal class MainWindowViewModel : ViewModelBase, ITRunnerService
    {
        public ObservableCollection<Program> GetProgramList()
        {
            return this.ProgramList;
        }

        public MainWindowViewModel()
        {
            var uris = new Uri[1];
            string addr = "net.tcp://localhost:7000/MainWindowViewModel";
            uris[0] = new Uri(addr);
            ITRunnerService tRunnerService = this;
            ServiceHost host = new ServiceHost(tRunnerService, uris);
            var binding = new NetTcpBinding(SecurityMode.None);
            host.AddServiceEndpoint(typeof(ITRunnerService), binding, string.Empty);
            host.Open();
        }
}

Теперь в графическом интерфейсе приложения TRunnerClient есть кнопка, которую я нажимаю, чтобы получитьданные из приложения TRunnerServer.Я только что получил метод, связанный со следующим:

private void Refresh(object parameter)
{
var uri = "net.tcp://localhost:7000/MainWindowViewModel";
NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);
var channel = new ChannelFactory<ITRunnerService>(binding);
var endPoint = new EndpointAddress(uri);
var proxy = channel.CreateChannel(endPoint);
this.ProgramList = proxy.GetProgramList();
}

Тем не менее, когда я запускаю приложение, только клиент запускается нормально, и приложение сервера выдает исключение на основе предупреждения об ошибке из xaml "Регистрация ужесуществует для URI 'net.tcp: // localhost: 7000 / MainWindowViewModel' ".

Как можно решить эту проблему?

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

1 Ответ

1 голос
/ 10 июля 2019

Сообщение об ошибке указывает на то, что старый серверный процесс все еще висит.Попробуйте убить его в диспетчере задач и попробуйте снова.

Чтобы избежать зависания процессов, убедитесь, что вы корректно выходите из приложения и не создаете никаких окон, которые не отображаются и не закрываются.

...