Сейчас я возьму TransactionScope в качестве примера. Представьте, что каждый метод в вашем WCF выполняет действия с базой данных, и вы хотите, чтобы каждый вызов выполнялся в транзакции. Вы можете включить блок using в каждый из ваших методов, и это сработает.

Мне интересно, есть ли более простой способ сделать это на уровне службы, а не на уровне метода? Например, события вызова метода до / после или что-то в ServiceBehavior.

Теперь я знаю, что конкретно для TransactionScope вы можете использовать атрибут TransactionScopeRequired, но если бы он не существовал, что бы вы делали?

0
MattH 23 Июл 2009 в 19:53

3 ответа

Лучший ответ

После дальнейших исследований, как говорит Марк, чистого раствора WCF не существует.

Однако есть решение, которое может быть приемлемым в определенных случаях.

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

Если ваше приложение может работать в режиме совместимости с ASP.NET, это означает, что ваша служба WCF может включать модуль HTTP. Это может подключиться к событию BeginRequest, создать объект и сохранить его в HttpContext.Current.Items. Затем по событию EndRequest мы можем получить этот объект и вызвать его метод Dispose ().

1
MattH 27 Июл 2009 в 19:24
К сожалению, это не работает, если операция является односторонней.
 – 
Nigel Sampson
21 Янв 2010 в 06:22

Подобные вещи также можно решить с помощью аспектно-ориентированного программирования. Это позволяет вам писать код, который можно «подключить» к любому / каждому методу вашего класса.

PostSharp - одна из библиотек АОП для .Net.

2
Sean Carpenter 27 Июл 2009 в 19:28

Что ж, на клиенте вы не обязательно всегда хотите заключать только один вызов в TransactionScope или какую-либо другую оболочку - возможно, в какой-то момент вы захотите иметь два, три или более вызовов, сгруппированных в «область видимости». .

Вы можете немного расширить WCF как на стороне клиента, так и на стороне сервера, но мне кажется, что это что-то настолько зависит от вашего фактического приложения и почти каждый раз, когда вы делаете такой вызов, что попытки принудительно что-либо здесь были бы не очень полезны .

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

Короче говоря: я не думаю, что то, что вы пытаетесь сделать, имеет большой смысл, и я не думаю, что вы могли бы сделать это даже с помощью только WCF - вам почти пришлось бы расширить язык C # (добавить компилятор обман, чтобы сделать что-то до и что-то еще после каждого вызова метода).

Марк

0
marc_s 23 Июл 2009 в 20:33