Генерация атрибутов FaultContract из.записи proto rpc


Я использую protobuf-net в проекте, над которым я работаю для контрактов данных, создавая файлы .proto вручную и заставляя пользовательский инструмент извергать код C#, который он должным образом выполняет. Я также начал использовать его для сервисных контрактов, и сервисные интерфейсы также созданы просто отлично.

Для подключения к некоторым системам я использую WCF, поэтому я включил опцию генератора datacontracts, и, хотя атрибуты System.ServiceModel присутствуют, похоже, нет никакого способа для я заявляю о конкретных недостатках, которые может вызвать служба.

Итак, моя проблема в основном:

  • язык буферов протокола, по-видимому, не имеет никаких конструкций для исключений/ошибок.
  • я не вижу никаких вариантов protobuf-net для генерации атрибутов FaultContract.
  • Интерфейс, сгенерированный protobuf-net, не объявлен частичным, поэтому я не могу дополнить сгенерированный код.

Есть ли способ объявить сбои работы службы WCF в protobuf-net или это то, что я должен был бы ждать версии 2?

Большое спасибо.

2 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#.