Сейчас я возьму TransactionScope в качестве примера. Представьте, что каждый метод в вашем WCF выполняет действия с базой данных, и вы хотите, чтобы каждый вызов выполнялся в транзакции. Вы можете включить блок using в каждый из ваших методов, и это сработает.
Мне интересно, есть ли более простой способ сделать это на уровне службы, а не на уровне метода? Например, события вызова метода до / после или что-то в ServiceBehavior.
Теперь я знаю, что конкретно для TransactionScope вы можете использовать атрибут TransactionScopeRequired, но если бы он не существовал, что бы вы делали?
3 ответа
После дальнейших исследований, как говорит Марк, чистого раствора WCF не существует.
Однако есть решение, которое может быть приемлемым в определенных случаях.
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
Если ваше приложение может работать в режиме совместимости с ASP.NET, это означает, что ваша служба WCF может включать модуль HTTP. Это может подключиться к событию BeginRequest, создать объект и сохранить его в HttpContext.Current.Items. Затем по событию EndRequest мы можем получить этот объект и вызвать его метод Dispose ().
Подобные вещи также можно решить с помощью аспектно-ориентированного программирования. Это позволяет вам писать код, который можно «подключить» к любому / каждому методу вашего класса.
PostSharp - одна из библиотек АОП для .Net.
Что ж, на клиенте вы не обязательно всегда хотите заключать только один вызов в TransactionScope или какую-либо другую оболочку - возможно, в какой-то момент вы захотите иметь два, три или более вызовов, сгруппированных в «область видимости». .
Вы можете немного расширить WCF как на стороне клиента, так и на стороне сервера, но мне кажется, что это что-то настолько зависит от вашего фактического приложения и почти каждый раз, когда вы делаете такой вызов, что попытки принудительно что-либо здесь были бы не очень полезны .
Более того, расширяемость WCF действительно начинается после того, как был сделан вызов, поэтому вы можете обрабатывать все виды сценариев, но, боюсь, вы не можете действительно обернуть внешний код в какую-либо область видимости.
Короче говоря: я не думаю, что то, что вы пытаетесь сделать, имеет большой смысл, и я не думаю, что вы могли бы сделать это даже с помощью только WCF - вам почти пришлось бы расширить язык C # (добавить компилятор обман, чтобы сделать что-то до и что-то еще после каждого вызова метода).
Марк
Похожие вопросы
Новые вопросы
.net
НЕ используйте для вопросов о .NET Core - используйте вместо этого [.net-core]. .NET Framework - это программная среда, предназначенная главным образом для операционной системы Microsoft Windows. Он включает в себя реализацию библиотеки базовых классов, общеязыковой среды выполнения (обычно называемой CLR), общей системы типов (обычно называемой CTS) и динамической среды исполнения. Он поддерживает множество языков программирования, включая C #, VB.NET, F # и C ++ / CLI.