Мы хотим, чтобы два приложения .NET, работающие на одном компьютере, обменивались данными друг с другом. Мы хотим три проекта. Библиотека, содержащая интерфейсы. Приложение "сервер", которое реализует интерфейсы и "клиентское" приложение, которое взаимодействует с сервером с использованием интерфейсов. Мы не хотим, чтобы клиент ссылался на сервер.
У нас есть тестовое приложение, которое делает это с удалением, но недавно обнаружило, что удаленное соединение заменяется WCF. Поскольку это новая разработка, мы считаем, что мы должны использовать WCF, но нам не удалось заставить ее работать с WCF и задавались вопросом, возможно ли это?
EDIT:
Извините за недостаток подробностей выше, но в то время у меня не было доступа к коду. Я работаю с двумя другими людьми в этом проекте и не смотрю внимательно на их материалы IPC. Я знаю, что они в настоящее время считают, что WCF не может делать то, что они хотят, и я надеюсь, что смогу показать им, что это возможно.
Я начал смотреть на мои попытки коллег на это и буду продолжать обновлять этот пост, насколько я его понимаю.
Ниже приведена упрощенная версия их тестового кода для удаленного доступа. Они хотят иметь возможность делать это с помощью WCF, но до сих пор не смогли заставить его работать.
- Lib\IMessage.cs
- Lib\IService.cs
- ServiceApp\Service.cs
- ServiceApp\ServiceMessage.cs
- ServiceApp\ServiceProgram.cs
- ClientApp\ClientProgram.cs
Оба сборки ServiceApp и ClientApp ссылаются на сборку Lib. Они не ссылаются друг на друга.
Я отредактирую это снова, когда я смогу объяснить их попытку воспроизвести это поведение в WCF. На данный момент я действительно знаю, что они используют NetNamedPipeBinding и испытывают проблемы с клиентским приложением, жалуясь на то, что он не может получить доступ к сборке служб.
EDIT:
Ниже приведена упрощенная версия тестового кода для WCF.
- Lib\IMessage.cs
- Lib\IService.cs
- ServiceApp\Service.cs
- ServiceApp\ServiceMessage.cs
- ServiceApp\ServiceProgram.cs
- ClientApp\ClientProgram.cs
Следующая строка из ClientProgram генерирует исключение:
IMessage msg2 = service.CreateMessage("Hello World");
Вот исключение:
Could not load file or assembly 'ServiceApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
EDIT:
В попытке понять последний комментарий Стивена я искал IMetadataExchange, который, конечно же, впервые попал на страницу Публикация метаданных.
Потому что для этого примера я не использую файлы конфигурации, но вместо этого я перехожу к ссылке публикация метаданных. Оттуда я перешел на ссылку Как опубликовать метаданные для службы с использованием кода, в которой был хороший пример, который я использовал для изменения моего код приложения-службы. Добавленный код находится в строках 15-20.
Мне удалось добавить ссылку на службу после небольшой работы. Служба должна быть запущена, но если вы запустите службу через Visual Studio, у вас нет возможности добавить ссылку на службу. Кроме того, я до сих пор не понимаю, как должна работать опция "Discover Services in Solution". В итоге мне удалось добавить ссылку, открыв папку bin/debug, чтобы вручную запустить службу, а затем ввести URL-адрес, который я добавил в мое служебное приложение. Если это правильный путь, это довольно неудобно.
После всего этого генерируется кодне делает ничего из-за меня. Во-первых, он воссоздает мой интерфейс IService, но превращает все мои IMessages в объекты и украшает его несколько иначе. Если их интерфейс используется, то не только он будет использовать другой IService, тогда мой сервис действительно реализуется, но методы в этом IService даже не имеют одинаковых подписей!
Отложив это, я предположил, что мне придется изменить свой клиент, чтобы использовать объекты из вновь созданного объекта, поэтому я изменил код клиента .
Теперь, когда я пытаюсь запустить его, я получаю следующую ошибку в строке 4:
The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:msg. The InnerException message was 'XML 'Element' 'http://tempuri.org/:msg' does not contain expected attribute 'http://schemas.microsoft.com/2003/10/Serialization/:Type'. The deserializer has no knowledge of which type to deserialize. Check that the type being serialized has the same contract as the type being deserialized.'. Please see InnerException for more details.
EDIT:
Один день ушел на щедрость и никаких ответов, так как я добавил щедрость. Есть ли что-нибудь, что я могу прояснить, пока не наступит время награды?
EDIT:
В конце концов мы пошли с удалением, потому что это не выглядит так, как будто мы хотим сделать это с WCF. Стивен Судит получает щедрость за всю свою помощь, несмотря на то, что все это было до того, как я предложил щедрость.