ServiceStack trying to bind private fields classes generated via service reference instead of public...












1















There is a remote service which I'm trying to get to send me messages via http POST requests using SOAP. I generated the service DTOs using the integrated in visual studio option "Add service reference".



Here's a sample of one autogenerated class:



[Route("/test", "POST")]
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true,
Namespace="http://www.reservationassistant.com/Booking/Types")]
public partial class UpdateBookingRequest
{

private Booking bookingField;

private string resortIdField;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public Booking Booking
{
get
{
return this.bookingField;
}
set
{
this.bookingField = value;
}
}


When I create my ServiceInterface methods and run my service, to go the metadata page I get this sample SOAP message



<UpdateBookingRequest>
<bookingField>
....
<bookingField>
<UpdateBookingRequest>


this is the code in my service interface class:



UpdateBookingResponse Post(UpdateBookingRequest request)
{
// do stuff with request
return null;
}


As you can probably imply by the auto-generated class the messages I receive will have tag names equal to the public properties in the generated DTOs. However this will never be possible, since for some reaason ServiceStack is trying to bind the incoming XML message elements to the private fields of the DTOs (sample SOAP message generated by the metadata page of my service - notice the "field" postfix after "booking"). How can I make the incoming messages to bind to the public properties and not the private fields?










share|improve this question



























    1















    There is a remote service which I'm trying to get to send me messages via http POST requests using SOAP. I generated the service DTOs using the integrated in visual studio option "Add service reference".



    Here's a sample of one autogenerated class:



    [Route("/test", "POST")]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true,
    Namespace="http://www.reservationassistant.com/Booking/Types")]
    public partial class UpdateBookingRequest
    {

    private Booking bookingField;

    private string resortIdField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public Booking Booking
    {
    get
    {
    return this.bookingField;
    }
    set
    {
    this.bookingField = value;
    }
    }


    When I create my ServiceInterface methods and run my service, to go the metadata page I get this sample SOAP message



    <UpdateBookingRequest>
    <bookingField>
    ....
    <bookingField>
    <UpdateBookingRequest>


    this is the code in my service interface class:



    UpdateBookingResponse Post(UpdateBookingRequest request)
    {
    // do stuff with request
    return null;
    }


    As you can probably imply by the auto-generated class the messages I receive will have tag names equal to the public properties in the generated DTOs. However this will never be possible, since for some reaason ServiceStack is trying to bind the incoming XML message elements to the private fields of the DTOs (sample SOAP message generated by the metadata page of my service - notice the "field" postfix after "booking"). How can I make the incoming messages to bind to the public properties and not the private fields?










    share|improve this question

























      1












      1








      1








      There is a remote service which I'm trying to get to send me messages via http POST requests using SOAP. I generated the service DTOs using the integrated in visual studio option "Add service reference".



      Here's a sample of one autogenerated class:



      [Route("/test", "POST")]
      [System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")]
      [System.SerializableAttribute()]
      [System.Diagnostics.DebuggerStepThroughAttribute()]
      [System.ComponentModel.DesignerCategoryAttribute("code")]
      [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true,
      Namespace="http://www.reservationassistant.com/Booking/Types")]
      public partial class UpdateBookingRequest
      {

      private Booking bookingField;

      private string resortIdField;

      /// <remarks/>
      [System.Xml.Serialization.XmlElementAttribute(Order=0)]
      public Booking Booking
      {
      get
      {
      return this.bookingField;
      }
      set
      {
      this.bookingField = value;
      }
      }


      When I create my ServiceInterface methods and run my service, to go the metadata page I get this sample SOAP message



      <UpdateBookingRequest>
      <bookingField>
      ....
      <bookingField>
      <UpdateBookingRequest>


      this is the code in my service interface class:



      UpdateBookingResponse Post(UpdateBookingRequest request)
      {
      // do stuff with request
      return null;
      }


      As you can probably imply by the auto-generated class the messages I receive will have tag names equal to the public properties in the generated DTOs. However this will never be possible, since for some reaason ServiceStack is trying to bind the incoming XML message elements to the private fields of the DTOs (sample SOAP message generated by the metadata page of my service - notice the "field" postfix after "booking"). How can I make the incoming messages to bind to the public properties and not the private fields?










      share|improve this question














      There is a remote service which I'm trying to get to send me messages via http POST requests using SOAP. I generated the service DTOs using the integrated in visual studio option "Add service reference".



      Here's a sample of one autogenerated class:



      [Route("/test", "POST")]
      [System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")]
      [System.SerializableAttribute()]
      [System.Diagnostics.DebuggerStepThroughAttribute()]
      [System.ComponentModel.DesignerCategoryAttribute("code")]
      [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true,
      Namespace="http://www.reservationassistant.com/Booking/Types")]
      public partial class UpdateBookingRequest
      {

      private Booking bookingField;

      private string resortIdField;

      /// <remarks/>
      [System.Xml.Serialization.XmlElementAttribute(Order=0)]
      public Booking Booking
      {
      get
      {
      return this.bookingField;
      }
      set
      {
      this.bookingField = value;
      }
      }


      When I create my ServiceInterface methods and run my service, to go the metadata page I get this sample SOAP message



      <UpdateBookingRequest>
      <bookingField>
      ....
      <bookingField>
      <UpdateBookingRequest>


      this is the code in my service interface class:



      UpdateBookingResponse Post(UpdateBookingRequest request)
      {
      // do stuff with request
      return null;
      }


      As you can probably imply by the auto-generated class the messages I receive will have tag names equal to the public properties in the generated DTOs. However this will never be possible, since for some reaason ServiceStack is trying to bind the incoming XML message elements to the private fields of the DTOs (sample SOAP message generated by the metadata page of my service - notice the "field" postfix after "booking"). How can I make the incoming messages to bind to the public properties and not the private fields?







      c# xml soap servicestack






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 16 '18 at 10:44









      Play4uPlay4u

      376




      376
























          1 Answer
          1






          active

          oldest

          votes


















          1














          First if you want Typed C# Services I would highly recommend using the more resilient, versatile, cleaner and faster alternative in C# Add ServiceStack Reference. SOAP is a slow, fragile and bloated serialization format that should only be considered for legacy integrations.



          By default ServiceStack uses .NET XML DataContract Serializer for XML or SOAP serialization so the behavior is dependent on .NET's XML DataContractSerializer implementation.



          For handling SOAP it uses WCF's generic Message class which uses DataContractSerializer by default but you can switch to populate WCF's Message using XmlSerializer implementation by adding the [XmlSerializerFormat] attribute on your Request and Response DTOs.



          You can request .NET's WCF svcutil to force generating DataContract or XmlSerializer classes using the /serializer command-line switch, e.g:



          svcutil endpoint.wsdl /serializer:DataContractSerializer
          svcutil endpoint.wsdl /serializer:XmlSerializer


          Overriding ContentTypes



          You can register a custom Content Type to override Xml Serialization used for XML requests, e.g. you can override it to use XmlSerializer implementation to handle XML requests with something like:



          ContentTypes.Register(MimeTypes.Xml,
          (req, dto, stream) => {
          using (var xw = XmlWriter.Create(stream))
          {
          var ser = new XmlSerializerWrapper(dto.GetType());
          ser.WriteObject(xw, dto);
          }
          },
          (type, stream) => {
          using (var reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas()))
          {
          var serializer = new System.Xml.Serialization.XmlSerializer(type);
          return serializer.Deserialize(reader);
          }
          });


          Metadata Preview for SOAP Requests



          As you're inferring the behavior from the metadata preview please note that the preview isn't generated using WCF Serializer for SOAP Requests, the Request Body is generated using the DataContraceSerializer so it wont reflect the same output if using XmlSerializer implementation in WCF Message.






          share|improve this answer


























          • Is there any way to either 1.) overwrite the serializer which SS uses to be XMLSerializer or 2.) if not, is there a way to automatically mark every field of the generated filed with the DataContractSerializer Attribute

            – Play4u
            Nov 16 '18 at 13:41













          • @Play4u I've updated my answer with more info, please note the metadata preview uses XML DataContractSerializer for its body and wont show the true output for WCF Requests using XmlSerializer impls.

            – mythz
            Nov 16 '18 at 14:55












          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53336235%2fservicestack-trying-to-bind-private-fields-classes-generated-via-service-referen%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          First if you want Typed C# Services I would highly recommend using the more resilient, versatile, cleaner and faster alternative in C# Add ServiceStack Reference. SOAP is a slow, fragile and bloated serialization format that should only be considered for legacy integrations.



          By default ServiceStack uses .NET XML DataContract Serializer for XML or SOAP serialization so the behavior is dependent on .NET's XML DataContractSerializer implementation.



          For handling SOAP it uses WCF's generic Message class which uses DataContractSerializer by default but you can switch to populate WCF's Message using XmlSerializer implementation by adding the [XmlSerializerFormat] attribute on your Request and Response DTOs.



          You can request .NET's WCF svcutil to force generating DataContract or XmlSerializer classes using the /serializer command-line switch, e.g:



          svcutil endpoint.wsdl /serializer:DataContractSerializer
          svcutil endpoint.wsdl /serializer:XmlSerializer


          Overriding ContentTypes



          You can register a custom Content Type to override Xml Serialization used for XML requests, e.g. you can override it to use XmlSerializer implementation to handle XML requests with something like:



          ContentTypes.Register(MimeTypes.Xml,
          (req, dto, stream) => {
          using (var xw = XmlWriter.Create(stream))
          {
          var ser = new XmlSerializerWrapper(dto.GetType());
          ser.WriteObject(xw, dto);
          }
          },
          (type, stream) => {
          using (var reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas()))
          {
          var serializer = new System.Xml.Serialization.XmlSerializer(type);
          return serializer.Deserialize(reader);
          }
          });


          Metadata Preview for SOAP Requests



          As you're inferring the behavior from the metadata preview please note that the preview isn't generated using WCF Serializer for SOAP Requests, the Request Body is generated using the DataContraceSerializer so it wont reflect the same output if using XmlSerializer implementation in WCF Message.






          share|improve this answer


























          • Is there any way to either 1.) overwrite the serializer which SS uses to be XMLSerializer or 2.) if not, is there a way to automatically mark every field of the generated filed with the DataContractSerializer Attribute

            – Play4u
            Nov 16 '18 at 13:41













          • @Play4u I've updated my answer with more info, please note the metadata preview uses XML DataContractSerializer for its body and wont show the true output for WCF Requests using XmlSerializer impls.

            – mythz
            Nov 16 '18 at 14:55
















          1














          First if you want Typed C# Services I would highly recommend using the more resilient, versatile, cleaner and faster alternative in C# Add ServiceStack Reference. SOAP is a slow, fragile and bloated serialization format that should only be considered for legacy integrations.



          By default ServiceStack uses .NET XML DataContract Serializer for XML or SOAP serialization so the behavior is dependent on .NET's XML DataContractSerializer implementation.



          For handling SOAP it uses WCF's generic Message class which uses DataContractSerializer by default but you can switch to populate WCF's Message using XmlSerializer implementation by adding the [XmlSerializerFormat] attribute on your Request and Response DTOs.



          You can request .NET's WCF svcutil to force generating DataContract or XmlSerializer classes using the /serializer command-line switch, e.g:



          svcutil endpoint.wsdl /serializer:DataContractSerializer
          svcutil endpoint.wsdl /serializer:XmlSerializer


          Overriding ContentTypes



          You can register a custom Content Type to override Xml Serialization used for XML requests, e.g. you can override it to use XmlSerializer implementation to handle XML requests with something like:



          ContentTypes.Register(MimeTypes.Xml,
          (req, dto, stream) => {
          using (var xw = XmlWriter.Create(stream))
          {
          var ser = new XmlSerializerWrapper(dto.GetType());
          ser.WriteObject(xw, dto);
          }
          },
          (type, stream) => {
          using (var reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas()))
          {
          var serializer = new System.Xml.Serialization.XmlSerializer(type);
          return serializer.Deserialize(reader);
          }
          });


          Metadata Preview for SOAP Requests



          As you're inferring the behavior from the metadata preview please note that the preview isn't generated using WCF Serializer for SOAP Requests, the Request Body is generated using the DataContraceSerializer so it wont reflect the same output if using XmlSerializer implementation in WCF Message.






          share|improve this answer


























          • Is there any way to either 1.) overwrite the serializer which SS uses to be XMLSerializer or 2.) if not, is there a way to automatically mark every field of the generated filed with the DataContractSerializer Attribute

            – Play4u
            Nov 16 '18 at 13:41













          • @Play4u I've updated my answer with more info, please note the metadata preview uses XML DataContractSerializer for its body and wont show the true output for WCF Requests using XmlSerializer impls.

            – mythz
            Nov 16 '18 at 14:55














          1












          1








          1







          First if you want Typed C# Services I would highly recommend using the more resilient, versatile, cleaner and faster alternative in C# Add ServiceStack Reference. SOAP is a slow, fragile and bloated serialization format that should only be considered for legacy integrations.



          By default ServiceStack uses .NET XML DataContract Serializer for XML or SOAP serialization so the behavior is dependent on .NET's XML DataContractSerializer implementation.



          For handling SOAP it uses WCF's generic Message class which uses DataContractSerializer by default but you can switch to populate WCF's Message using XmlSerializer implementation by adding the [XmlSerializerFormat] attribute on your Request and Response DTOs.



          You can request .NET's WCF svcutil to force generating DataContract or XmlSerializer classes using the /serializer command-line switch, e.g:



          svcutil endpoint.wsdl /serializer:DataContractSerializer
          svcutil endpoint.wsdl /serializer:XmlSerializer


          Overriding ContentTypes



          You can register a custom Content Type to override Xml Serialization used for XML requests, e.g. you can override it to use XmlSerializer implementation to handle XML requests with something like:



          ContentTypes.Register(MimeTypes.Xml,
          (req, dto, stream) => {
          using (var xw = XmlWriter.Create(stream))
          {
          var ser = new XmlSerializerWrapper(dto.GetType());
          ser.WriteObject(xw, dto);
          }
          },
          (type, stream) => {
          using (var reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas()))
          {
          var serializer = new System.Xml.Serialization.XmlSerializer(type);
          return serializer.Deserialize(reader);
          }
          });


          Metadata Preview for SOAP Requests



          As you're inferring the behavior from the metadata preview please note that the preview isn't generated using WCF Serializer for SOAP Requests, the Request Body is generated using the DataContraceSerializer so it wont reflect the same output if using XmlSerializer implementation in WCF Message.






          share|improve this answer















          First if you want Typed C# Services I would highly recommend using the more resilient, versatile, cleaner and faster alternative in C# Add ServiceStack Reference. SOAP is a slow, fragile and bloated serialization format that should only be considered for legacy integrations.



          By default ServiceStack uses .NET XML DataContract Serializer for XML or SOAP serialization so the behavior is dependent on .NET's XML DataContractSerializer implementation.



          For handling SOAP it uses WCF's generic Message class which uses DataContractSerializer by default but you can switch to populate WCF's Message using XmlSerializer implementation by adding the [XmlSerializerFormat] attribute on your Request and Response DTOs.



          You can request .NET's WCF svcutil to force generating DataContract or XmlSerializer classes using the /serializer command-line switch, e.g:



          svcutil endpoint.wsdl /serializer:DataContractSerializer
          svcutil endpoint.wsdl /serializer:XmlSerializer


          Overriding ContentTypes



          You can register a custom Content Type to override Xml Serialization used for XML requests, e.g. you can override it to use XmlSerializer implementation to handle XML requests with something like:



          ContentTypes.Register(MimeTypes.Xml,
          (req, dto, stream) => {
          using (var xw = XmlWriter.Create(stream))
          {
          var ser = new XmlSerializerWrapper(dto.GetType());
          ser.WriteObject(xw, dto);
          }
          },
          (type, stream) => {
          using (var reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas()))
          {
          var serializer = new System.Xml.Serialization.XmlSerializer(type);
          return serializer.Deserialize(reader);
          }
          });


          Metadata Preview for SOAP Requests



          As you're inferring the behavior from the metadata preview please note that the preview isn't generated using WCF Serializer for SOAP Requests, the Request Body is generated using the DataContraceSerializer so it wont reflect the same output if using XmlSerializer implementation in WCF Message.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 16 '18 at 15:01

























          answered Nov 16 '18 at 12:13









          mythzmythz

          120k14198339




          120k14198339













          • Is there any way to either 1.) overwrite the serializer which SS uses to be XMLSerializer or 2.) if not, is there a way to automatically mark every field of the generated filed with the DataContractSerializer Attribute

            – Play4u
            Nov 16 '18 at 13:41













          • @Play4u I've updated my answer with more info, please note the metadata preview uses XML DataContractSerializer for its body and wont show the true output for WCF Requests using XmlSerializer impls.

            – mythz
            Nov 16 '18 at 14:55



















          • Is there any way to either 1.) overwrite the serializer which SS uses to be XMLSerializer or 2.) if not, is there a way to automatically mark every field of the generated filed with the DataContractSerializer Attribute

            – Play4u
            Nov 16 '18 at 13:41













          • @Play4u I've updated my answer with more info, please note the metadata preview uses XML DataContractSerializer for its body and wont show the true output for WCF Requests using XmlSerializer impls.

            – mythz
            Nov 16 '18 at 14:55

















          Is there any way to either 1.) overwrite the serializer which SS uses to be XMLSerializer or 2.) if not, is there a way to automatically mark every field of the generated filed with the DataContractSerializer Attribute

          – Play4u
          Nov 16 '18 at 13:41







          Is there any way to either 1.) overwrite the serializer which SS uses to be XMLSerializer or 2.) if not, is there a way to automatically mark every field of the generated filed with the DataContractSerializer Attribute

          – Play4u
          Nov 16 '18 at 13:41















          @Play4u I've updated my answer with more info, please note the metadata preview uses XML DataContractSerializer for its body and wont show the true output for WCF Requests using XmlSerializer impls.

          – mythz
          Nov 16 '18 at 14:55





          @Play4u I've updated my answer with more info, please note the metadata preview uses XML DataContractSerializer for its body and wont show the true output for WCF Requests using XmlSerializer impls.

          – mythz
          Nov 16 '18 at 14:55




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53336235%2fservicestack-trying-to-bind-private-fields-classes-generated-via-service-referen%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Xamarin.iOS Cant Deploy on Iphone

          Glorious Revolution

          Dulmage-Mendelsohn matrix decomposition in Python