Существует официально поддерживаемая документация jQuery файл JavaScript для Visual Studio 2008. Этот файл является только временной фиксацией, пока Microsoft не выпускает текущие исправления, которые более адекватно решат проблему.
Встроенный в ASPX:
<% if (false) { %>
<% } %>
Встроенный в JavaScript:
///
Берут его здесь: ссылки jquery-1.2.6-vsdoc.js
:
Вы должны открывать своего клиента при каждом вызове и сразу же закрывать его. Если вы сомневаетесь, просмотрите файл SVC с помощью IE и посмотрите на приведенный там пример.
Я использую Silverlight с WCF с версии V2 (сейчас работаю с V4), и вот что я нашел. В общем, очень хорошо открыть одного клиента и просто использовать его для всех коммуникаций. И если вы не используете DuplexHttBinding, он также отлично работает, чтобы делать прямо противоположное: каждый раз открывать новое соединение, а затем закрывать его, когда вы закончите. И из-за того, как Microsoft спроектировала клиент WCF в Silverlight, вы не увидите большой разницы в производительности между постоянным открытием одного клиента и созданием нового клиента для каждого запроса. (Но если вы создаете нового клиента с каждым запросом, убедитесь, что вы тоже закрываете его.)
Теперь, если вы используете DuplexHttBinding, т.е. если вы хотите вызывать методы на клиенте с сервера, конечно, важно, чтобы вы не закрывали клиент при каждом запросе. Это просто здравый смысл. Однако ни одна из документации не сообщает вам, но что я считаю абсолютно критичным, так это то, что если вы используете DuplexHttBinding, вы должны одновременно открывать только один экземпляр клиента. В противном случае вы re собираетесь столкнуться со всевозможными неприятными проблемами с тайм-аутом, которые будет очень, очень сложно устранить. Ваша жизнь станет значительно проще, если у вас будет только одно соединение.
Я применил это в моем собственном коде, чтобы запустить все мои соединения через один статический класс DataConnectionManager, который выдает Assert, если я пытаюсь открыть второе соединение перед закрытием первого. Несколько фрагментов из этого класса:
private static int clientsOpen;
public static int ClientsOpen
{
get
{
return clientsOpen;
}
set
{
clientsOpen = value;
Debug.Assert(clientsOpen <= 1, "Bad things seem to happen when there's more than one open client.");
}
}
public static RoomServiceClient GetRoomServiceClient()
{
ClientsCreated++;
ClientsOpen++;
Logger.LogDebugMessage("Clients created: {0}; Clients open: {1}", ClientsCreated, ClientsOpen);
return new RoomServiceClient(GetDuplexHttpBinding(), GetDuplexHttpEndpoint());
}
public static void TryClientClose(RoomServiceClient client, bool waitForPendingCalls, Action<Exception> callback)
{
if (client != null && client.State != CommunicationState.Closed)
{
client.CloseCompleted += (sender, e) =>
{
ClientsClosed++;
ClientsOpen--;
Logger.LogDebugMessage("Clients closed: {0}; Clients open: {1}", ClientsClosed, ClientsOpen);
if (e.Error != null)
{
Logger.LogDebugMessage(e.Error.Message);
client.Abort();
}
closingIntentionally = false;
if (callback != null)
{
callback(e.Error);
}
};
closingIntentionally = true;
if (waitForPendingCalls)
{
WaitForPendingCalls(() => client.CloseAsync());
}
else
{
client.CloseAsync();
}
}
else
{
if (callback != null)
{
callback(null);
}
}
}
Разумеется, раздражает то, что если у вас только одно соединение, вам нужно отловить случай, когда это соединение закрывается непреднамеренно, и попытаться открыть его снова. И затем вам нужно повторно инициализировать все обратные вызовы, для обработки которых были зарегистрированы ваши разные классы. На самом деле это не так уж и сложно, но очень неприятно следить за тем, чтобы все было сделано правильно. И конечно же автоматическое тестирование этой части сложно, если вообще возможно. . .
У WCF есть настройки конфигурации, которые говорят ему, как долго он должен ждать возврата вызова, я думаю, что когда он не завершится в разрешенное время, AsyncClose закроет его. Поэтому вызовите client.AsyncClose ().