Я знаю, что это старый вопрос, но сегодня я столкнулся с этим поиском предварительно упакованного решения этой проблемы и не нашел ничего, что действительно соответствовало моим потребностям.
Вот решение (только на английском языке), которое правильно поддерживает верхний регистр (сдвинутый), нижний регистр, пунктуацию, цифровую клавиатуру и т. д.
Это также позволяет просто и прямолинейно идентификация - и реакция на - непечатаемые ключи, такие как ESC, стрелки, функциональные клавиши и т. д.
https://jsfiddle.net/5hhu896g/1/
keyboardCharMap and keyboardNameMap are the key to making this work
Спасибо DaveAlger за то, что вы меня немного набрали - и много открытий! - путем предоставления массива с именованным ключом.
Получение исключения дистанционной работы не гарантирует, что Ваш сервер в порядке. Если что-то еще, окажется, будет работать и слушать на том порте, то соединение успешно выполнится, и Вы не получите исключительную ситуацию сокета. Что происходит, в этом случае зависит от того, как приложение, которое на самом деле получило Ваше соединение, ведет себя, но оно, вероятно, завершит генерацию исключения дистанционной работы в Вашем клиенте.
Потребовалось бы немного больше расследования для проверки этого, но я полагаю, что исключение дистанционной работы указывает на проблему в связи между клиентом и сервером, таким образом, нет "стороны клиента" или "стороны сервера", которая генерировала его. Это означает, что эти два не говорили счастливо, и это, возможно, было вызвано любым.
Если Вы намереваетесь использовать пользовательские типы исключительной ситуации, которые будут брошены через границу дистанционной работы, несомненно, отметят эти типы как" [сериализуемые]". Я не могу помнить точное сообщение об ошибке, но оно озадачило меня к лучшему часть дня в первый раз, когда я видел его.
Кроме того, просто подсказка, TargetInvocationException часто встраивали РЕАЛЬНОЕ исключение в его свойство InnerException. Нет ничего более бесполезного, чем "Исключение было выдано целью вызова".
Попытайтесь гарантировать, что Вы отправляете корректное сообщение, и сообщения, полученные сервером, также корректны, например, утверждения использования (это называет Дизайном Контракт). Если у Вас есть такая возможность, попытайтесь отладить сторону сервера и сторону клиента одновременно. (выполнение двух экземпляров VS одновременно)
У меня нет доступа к исходному коду моего последнего приложения дистанционной работы, но насколько я могу помнить, что мы не могли выяснить способ знать для определенного, если бы сервер возрос с какого-либо из исключений, мы добрались.
Мы действительно проверяли, чтобы видеть, присутствовала ли сеть и предупредила пользователя, если не (метод на классе Среды я думаю).
Хорошо теперь, когда Вы поместили его тот путь, я предполагаю, что Вы - использование TCP для дистанционной работы, поскольку, если бы это было через HTTP, это был бы WebException, брошенный при отказе соединиться с (сетевой порт TCP) сервер. Когда сервер не запустит прикладную программу для регистрации канала на том обозначенном порте TCP, Вы получите SocketException. В конце концов, сервер не слушает/отвечает тот порт, как клиент может когда-либо делать сокетное соединение?
Но, если Вы получаете RemotingException, это не должно обязательно означать, что сервер имеет свое надлежащее хорошо работающее приложение Дистанционной работы. Вы могли протестировать путем соединения с неправильным URI на неправильном порте, как порт 80 (IIS).
IMyRemoteObject obj = (IMyRemoteObject) Activator.GetObject(
typeof(IMyRemoteObject),
"tcp://localhost:80/MyRemoteObject.rem");
Это привело бы к RemotingException, потому что, в то время как клиент может сделать соединение TCP для портирования 80, это - IIS, отвечающий на вызов а не приложение Дистанционной работы; IIS не может обработать вызовы дистанционной работы непосредственно. Однако RemotingException может также весьма иметь в виду проблему в стороне клиента. Эта статья блога может помочь Вам понять лучше.
Если бы логика серверного приложения выдала исключение, то она должна смочь упорядочить клиенту для уведомления его, что произошло. Можно протестировать это путем преднамеренной выдачи исключения в одном из методов удаленного объекта. Затем назовите тот конкретный метод от стороны клиента, ожидая исключение:
HttpChannel channel = new HttpChannel();
ChannelServices.RegisterChannel(channel);
IMyRemoteObject obj = (IMyRemoteObject) Activator.GetObject(
typeof(IMyRemoteObject),
"http://localhost:1234/MyRemoteObject.soap");
Console.WriteLine("Client.Main(): Reference to rem.obj. acquired");
int tmp = obj.GetValue();
Console.WriteLine("Client.Main(): Original server side value: {0}",tmp);
Console.WriteLine("Client.Main(): Will set value to 42");
try
{
// This method will throw an ApplicationException in the server-side code.
obj.SetValue(42);
}
catch (Exception ex)
{
Console.WriteLine("=====");
Console.WriteLine("Exception type: " + ex.GetType().ToString());
Console.WriteLine("Message: " + ex.Message);
Console.WriteLine("Source: " + ex.Source);
Console.WriteLine("Stack trace: " + ex.StackTrace);
Console.WriteLine("=====");
}
Можно ожидать исключение, полученное как это
=====
Exception type: System.ApplicationException
Message: testing
Source: Server
Stack trace:
Server stack trace:
at Server.MyRemoteObject.SetValue(Int32 newval) in i:\projects\remoting.net\ch03\01_singlecallobjects\server\server.cs:line 27
at System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(MethodBase mb, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at General.IMyRemoteObject.SetValue(Int32 newval)
at Client.Client.Main(String[] args) in i:\projects\remoting.net\ch03\01_singlecallobjects\client\client.cs:line 29
=====
Это должно сказать Вам, что Источник в сервере с отслеживанием стека серверной стороны.