Является ли SoapHttpClientProtocol потокобезопасным?

Я создал прокси-сервер веб-службы с функцией «добавить веб-ссылку» VS 2008 (С#).

Сгенерированный класс происходит от SoapHttpClientProtocol

Могу ли я хранить только один экземпляр моего прокси в синглтоне? Это потокобезопасно? Есть ли состояние между вызовами, которое помешало бы мне это сделать?


person Mike Gleason jr Couturier    schedule 17.12.2009    source источник
comment
ASMX — это устаревшая технология, и ее не следует использовать для новых разработок. WCF или веб-API ASP.NET следует использовать для всех новых разработок клиентов и серверов веб-служб. Один совет: Microsoft удалила форум ASMX в MSDN.   -  person John Saunders    schedule 11.01.2014


Ответы (4)


Нет. Это не потокобезопасно. клиент должен находиться в состоянии Open, чтобы разрешить вызовы. Простой сценарий, когда один поток выполняет client.Close(), а другой пытается вызвать метод, завершится ошибкой.

person Adrian Zanescu    schedule 18.12.2009
comment
Этот класс не имеет метода Close и не имеет его, по крайней мере, начиная с версии 3.0. Смотрите ответ ChrisW. - person River Satya; 23.11.2015
comment
@RiverSatya - ответ был опубликован 8 лет назад - person Adrian Zanescu; 02.05.2017
comment
Да и он устарел. Поскольку это принятый ответ, я добавил указатель на более свежий. - person River Satya; 03.05.2017

MSDN говорит, что SoapHttpClientProtocol является потокобезопасным:

Безопасность потоков

Этот тип является потокобезопасным.

Для другого класса, такого как System. MSDN сообщает, что Windows.Forms не является потокобезопасным.

Безопасность потоков

Любые общедоступные статические (общие в Visual Basic) члены этого типа являются потокобезопасными. Любые члены экземпляра не гарантируют потокобезопасность.


Вот Сотрудник Microsoft/MSDN говорит (хотя и без гарантии), что это потокобезопасно:

Привет Макс,

Для прокси-сервера веб-службы я думаю, что он должен быть потокобезопасным, поскольку сгенерированный .NET класс прокси-сервера является производным от класса SoapHttpClientProtocol, который помечен как потокобезопасный в документе:

Класс SoapHttpClientProtocol

http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soaphttpclientprotocol(VS.71).aspx

следовательно, должно быть безопасно использовать его в многопоточном контексте, если вы вручную не добавили какой-либо контекстно-зависимый член в производном прокси-классе. Ты так думаешь?

Искренне,

Стивен Ченг

Руководитель онлайн-поддержки Microsoft MSDN

Эта публикация предоставляется КАК ЕСТЬ, без каких-либо гарантий и не дает никаких прав.

person ChrisW    schedule 09.01.2014
comment
-1: вы обсуждаете устаревшую технологию и ссылаетесь на статью из .NET 1.1. - person John Saunders; 11.01.2014
comment
Первая ссылка, которую я дал, - это текущая (.NET 4.5) документация для класса: в которой все еще говорится, что он потокобезопасен. Последняя ссылка, которую я дал, — это прямая цитата из старого поста на форуме, написанного сотрудником MSFT (для подтверждения того, как следует понимать документацию MSDN). - person ChrisW; 11.01.2014
comment
Ни одно из этих утверждений не противоречит тому, что я сказал. - person John Saunders; 11.01.2014
comment
@JohnSaunders У вас есть предложение по улучшению этого ответа? - person ChrisW; 11.01.2014
comment
Я вижу: возможно, это не ответ, который вам конкретно не нравится, это вопрос / тема (которая касается устаревших технологий). - person ChrisW; 11.01.2014
comment
С уважением, я думаю, что нажатие на ссылку удаления было бы улучшением. - person John Saunders; 11.01.2014
comment
@JohnSaunders Я думал, что должен опубликовать это, чтобы исправить неверную информацию: потому что, насколько мне известно, этот ответ был неправильный. - person ChrisW; 11.01.2014
comment
Да, я действительно не знаю. Я предполагаю, что формулировку можно принять за чистую монету: этот тип потокобезопасен - как класс, так и экземпляры объектов. Просматривая код в рефлекторе, я не смог найти ничего, что могло бы быть состоянием гонки. Я не знаю, о чем ворчит Джон. Вопрос в том, является ли SoapHttpClientProtocol потокобезопасным; нет, если думает, что люди должны его использовать. - person Ian Boyd; 12.01.2014
comment
@JohnSaunders Меня больше интересует, как использовать новый класс ClientBase<T> потокобезопасно (см. ">здесь или здесь, и этот новый вопрос Потокобезопасный доступ к каналу WCF), если вы можете ответить на этот вопрос? - person ChrisW; 12.01.2014
comment
@IanBoyd: я думаю, что вы сильно рискуете в зависимости от кода, который почти не поддерживает потокобезопасность. Что, если выяснится, что существует существует состояние гонки? Вы понимаете, что Microsoft это не исправит? Кроме того, только потому, что базовый класс является потокобезопасным, это не означает, что сгенерированные прокси-классы, производные от него, являются потокобезопасными. - person John Saunders; 12.01.2014
comment
@ChrisW: На самом деле я только что попытался удалить свой отрицательный голос, но не могу, пока вы не отредактируете. - person John Saunders; 12.01.2014
comment
@JohnSaunders Спасибо; но мне не нужно редактировать этот ответ: я действительно хочу (научиться) использовать ClientBase (безопасно). Я наткнулся на этот (старый) вопрос только через Google google.com /search?q=asp.net+soap+thread-safe - person ChrisW; 12.01.2014
comment
Некоторые люди не могут обновиться до последней и лучшей версии и застряли на устаревших технологиях. Запомни. - person Hugh Jeffner; 20.06.2014

По этой ссылке: http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soaphttpclientprotocol.aspx

внизу под «безопасностью потоков» говорится, что этот тип является потокобезопасным. Однако я не знаю, что использование его в качестве синглтона будет потокобезопасным.

person Tony The Lion    schedule 17.12.2009

MSDN не упоминает, что потокобезопасный:

Безопасность потоков

Этот тип является потокобезопасным.

Класс безопасен, нет упоминания об объекте.

Но можно с уверенностью сказать, что это не потокобезопасно — ни один объект в библиотеке .NET не является потокобезопасным.

(По крайней мере, я никогда не видел)

person Ian Boyd    schedule 17.12.2009
comment
Обычно для типов, не являющихся потокобезопасными, формулировка будет следующей: Все члены класса гарантированно будут потокобезопасными. Не гарантируется, что все члены экземпляра будут потокобезопасными. поэтому я бы предположил, что этот тип потокобезопасен, подразумевает как члены класса, так и члены экземпляра. - person Joey; 17.12.2009
comment
хорошо, я запутался ... может быть, лучше было бы задать вопрос: создание экземпляра прокси-сервера веб-службы для каждого вызова веб-метода снижает производительность? :П - person Mike Gleason jr Couturier; 17.12.2009
comment
я предполагаю, что под типом они подразумевают только тип (это информация о типе), в отличие от статических членов класса или членов экземпляра, которые не являются потокобезопасными. - person Ian Boyd; 18.12.2009
comment
Я написал другой ответ, который говорит противоположное вашему. Что вы считаете правильным? - person ChrisW; 10.01.2014