Генерация атрибутов FaultContract из.записи proto rpc
Я использую protobuf-net в проекте, над которым я работаю для контрактов данных, создавая файлы .proto
вручную и заставляя пользовательский инструмент извергать код C#, который он должным образом выполняет.
Я также начал использовать его для сервисных контрактов, и сервисные интерфейсы также созданы просто отлично.
Для подключения к некоторым системам я использую WCF, поэтому я включил опцию генератора datacontracts
, и, хотя атрибуты System.ServiceModel
присутствуют, похоже, нет никакого способа для я заявляю о конкретных недостатках, которые может вызвать служба.
Итак, моя проблема в основном:
- язык буферов протокола, по-видимому, не имеет никаких конструкций для исключений/ошибок.
- я не вижу никаких вариантов protobuf-net для генерации атрибутов FaultContract. Интерфейс, сгенерированный protobuf-net, не объявлен частичным, поэтому я не могу дополнить сгенерированный код.
Есть ли способ объявить сбои работы службы WCF в protobuf-net или это то, что я должен был бы ждать версии 2?
Большое спасибо.
2 ответа:
Я не уверен, почему я не объявляю это как
partial interface
, поскольку это кажется совершенно счастливым в C# 2.0; я изменю это, когда получу второе, но обратите внимание, что вы можете применить ручное изменение локально - просто отредактировав csharp.XSLT-файл. Так вот, xslt-это не всеобщая чашка чая, но это должно быть изменение в 1 строку (рядом со словомinterface
) - на самом деле, это, вероятно, добавлениеpartial
здесь:<xsl:template match="ServiceDescriptorProto"> <xsl:if test="($optionClientProxy or $optionDataContract)"> [global::System.ServiceModel.ServiceContract(Name = @"<xsl:value-of select="name"/>")]</xsl:if> public /* HERE => */ partial /* <= HERE */ interface I<xsl:value-of select="name"/> { <xsl:apply-templates select="method"/> } <xsl:if test="$optionProtoRpc"> public class <xsl:value-of select="name"/>Client : global::ProtoBuf.ServiceModel.RpcClient { public <xsl:value-of select="name"/>Client() : base(typeof(I<xsl:value-of select="name"/>)) { } <xsl:apply-templates select="method/MethodDescriptorProto" mode="protoRpc"/> } </xsl:if> <xsl:apply-templates select="." mode="clientProxy"/> </xsl:template>
Поскольку xslt поддается настройке, вы должны быть в состоянии применить любые другие изменения, которые вы требовать.
это не дает прямого ответа на ваш вопрос, но может быть уместно в любом случае
протобуф-сеть не нужна .протофайлы должны работать, поэтому было бы столько же усилий, чтобы просто написать ваши классы C# и украсить их атрибутами WCF (и вашими атрибутами FaultContract), чем создавать протофайлы (вручную) для создания классов C#.