Вам нужна какая-то форма IPC (межпроцессное взаимодействие). Какой из них вы выберете, может сильно зависеть от того, что вы хотите разрешить, а что нет. Например, вам нужно учитывать следующее:
- Должен ли какой-либо компьютер отправлять этот запрос в службу или только на локальный компьютер?
- Может ли какой-либо пользователь иметь возможность отправить этот запрос, или только определенные пользователи / роли?
- Если содержимое сообщения видят другие пользователи, это потенциальное нарушение безопасности?
- Нужно ли службе подтверждать сообщение или отправлять ответ?
- Должно ли сообщение быть защищенным от несанкционированного доступа?
- Сколько процессов / потоков будет отправлять сообщения в службу одновременно?
Как вы видите, есть только множество проблем, которые вы открываете, когда вводите IPC. Примите во внимание приведенные выше вопросы и найдите следующие возможные решения:
- .Net Remoting - Легко, но имеет проблемы с безопасностью и надежностью.
- Службы WCF - (.Net 3 или более поздняя версия). Легко кодируется, не очень надежен при больших нагрузках.
- Сокеты - трудно кодировать, трудно понять, но можно заставить работать.
- DCOM - размещение COM-объекта в вашем .Net-процессе и разрешение Windows маршализовать вызов.
- Win32 RPC - Необработанные библиотеки Win32 существуют в C # , или вы можете написать свою собственную.
Все они имеют взлеты и падения, плюсы и минусы. Это действительно зависит от ваших конкретных потребностей.
Поскольку вы указали, что пытались вызвать службу с локального компьютера, самый простой способ - это использовать WCF поверх именованных каналов (который пытается ограничить связь с локальным компьютером). Если вы просто хотите передавать двоичные данные в службу и из службы, то библиотека RPC, связанная выше, будет работать нормально.
В следующем примере демонстрируется использование вышеуказанной библиотеки RPC:
Поставьте это на службу:
Guid iid = new Guid("{....}");
using (RpcServerApi server = new RpcServerApi(iid))
{
server.OnExecute +=
delegate(IRpcClientInfo client, byte[] arg)
{
byte[] response;
//do whatever
return response;
};
server.AddProtocol(RpcProtseq.ncalrpc, "MyServiceName", 5);
server.AddAuthentication(RpcAuthentication.RPC_C_AUTHN_WINNT);
server.StartListening();
...
А вот код клиента:
Guid iid = new Guid("{....}");
using (RpcClientApi client = new RpcClientApi(iid, RpcProtseq.ncalrpc, null, "MyServiceName"))
{
client.AuthenticateAs(null, RpcClientApi.Self, RpcProtectionLevel.RPC_C_PROTECT_LEVEL_PKT_PRIVACY, RpcAuthentication.RPC_C_AUTHN_WINNT);
byte[] input, output;
output = client.Execute(input);
}