Wcf запрос всегда приходит с нулевыми параметрами - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь вызвать через REST-запрос в SOAPUI службу WCF, работающую на локальном хосте из Visual Studio. Моя проблема в том, что запрос приходит со своими свойствами, равными нулю. Вот JSON запроса:

    { 
   "request":{ 
      "order":{ 
         "uuid":"FEAEBDE7-8328-4E39-99F3-CD83F7405573",
         "created":"2019-06-06T00:47:05+0200",
         "created_from_client_timezone":"2019-06-05T23:47:05+0100",
         "amount":1,
         "currency":"978",
         "paid":true,
         "status":"SUCCESS",
         "safe":true,
         "refunded":0,
         "additional":"Additional",
         "service":"REDSYS",
         "antifraud":"",
         "customer":"IDInterno",
         "transactions":[ 
            { 
               "uuid":"168A6B19-2F9A-4367-A1E6-3E382CBCA3B3",
               "created":"2019-06-06T00:54:52+0200",
               "created_from_client_timezone":"2019-06-05T23:54:52+0100",
               "operative":"AUTHORIZATION",
               "amount":1,
               "authorization":"188426",
               "status":"SUCCESS",
               "error":"NONE",
               "source":{ 
                  "object":"CARD",
                  "uuid":"15DAE75D-121C-4396-AEB4-988B8455E103",
                  "type":"CREDIT",
                  "token":"ebc9b5ffa2efcf74197734a071192817e6f2a3fc15f49c4b1bdb6edc46b16e3ab4109498bff8e6ba00fb6d2bd1838afbea67095c4caaa2f46e4acf4d5851884c",
                  "brand":"VISA",
                  "country":"ES",
                  "holder":"teste",
                  "bin":454881,
                  "last4":"0004",
                  "expire_month":"12",
                  "expire_year":"20",
                  "additional":"",
                  "bank":"SERVIRED, SOCIEDAD ESPANOLA DE MEDIOS DE PAGO, S.A."
               }
            }
         ],
         "token":"971857af7a43f021059fb2c7f62cb90e601fafe9a133062d0bca224bf6fc33899b68092288772331f33c310e422c51b0ca9bfb7bf7a6cad3af30473c992a7776",
         "ip":"82.154.162.202"
      },
      "client":{ 
         "uuid":"756CC6A3-933F-424B-B53B-39EC52118E7D"
      }
   }
}

Это мой контракт данных в C #, составленный путем сопоставления JSON2CHARP:

[Serializable, JsonObject, DataContract]
        public partial class Request
        {
            [DataMember]
            [JsonProperty("order", Required = Required.Always)]
            public Order Order { get; set; }

            [DataMember]
            [JsonProperty("client", Required = Required.Always)]
            public Client Client { get; set; }
        }

        [Serializable, JsonObject, DataContract]
        public partial class Client
        {
            [DataMember]
            [JsonProperty("uuid", Required = Required.Always)]
            public string Uuid { get; set; }
        }

        [Serializable, JsonObject, DataContract]
        public partial class Order
        {
            [DataMember]            
            [JsonProperty("uuid", Required = Required.Always)]
            public string Uuid { get; set; }

            [DataMember]            
            [JsonProperty("created", Required = Required.Always)]
            public string Created { get; set; }

            [DataMember]            
            [JsonProperty("created_from_client_timezone", Required = Required.Always)]
            public string CreatedFromClientTimezone { get; set; }

            [DataMember]            
            [JsonProperty("amount", Required = Required.Always)]
            public long Amount { get; set; }

            [DataMember]            
            [JsonProperty("currency", Required = Required.Always)]
            [JsonConverter(typeof(ParseStringConverter))]
            public long Currency { get; set; }

            [DataMember]            
            [JsonProperty("paid", Required = Required.Always)]
            public bool Paid { get; set; }

            [DataMember]            
            [JsonProperty("status", Required = Required.Always)]
            public string Status { get; set; }

            [DataMember]            
            [JsonProperty("safe", Required = Required.Always)]
            public bool Safe { get; set; }

            [DataMember]            
            [JsonProperty("refunded", Required = Required.Always)]
            public long Refunded { get; set; }

            [DataMember]            
            [JsonProperty("additional", Required = Required.Always)]
            public string Additional { get; set; }

            [DataMember]            
            [JsonProperty("service", Required = Required.Always)]
            public string Service { get; set; }

            [DataMember]            
            [JsonProperty("antifraud", Required = Required.Always)]
            public string Antifraud { get; set; }

            [DataMember]            
            [JsonProperty("customer", Required = Required.Always)]
            public string Customer { get; set; }

            [DataMember]
            [JsonProperty("transactions", Required = Required.Always)]
            public List<Transaction> Transactions { get; set; }

            [DataMember]            
            [JsonProperty("token", Required = Required.Always)]
            public string Token { get; set; }

            [DataMember]            
            [JsonProperty("ip", Required = Required.Always)]
            public string Ip { get; set; }
        }

        [Serializable, JsonArray, DataContract]
        public partial class Transaction
        {
            [DataMember]            
            [JsonProperty("uuid", Required = Required.Always)]
            public string Uuid { get; set; }

            [DataMember]            
            [JsonProperty("created", Required = Required.Always)]
            public string Created { get; set; }

            [DataMember]            
            [JsonProperty("created_from_client_timezone", Required = Required.Always)]
            public string CreatedFromClientTimezone { get; set; }

            [DataMember]            
            [JsonProperty("operative", Required = Required.Always)]
            public string Operative { get; set; }

            [DataMember]            
            [JsonProperty("amount", Required = Required.Always)]
            public long Amount { get; set; }

            [DataMember]            
            [JsonProperty("authorization", Required = Required.Always)]
            [JsonConverter(typeof(ParseStringConverter))]
            public long Authorization { get; set; }

            [DataMember]            
            [JsonProperty("status", Required = Required.Always)]
            public string Status { get; set; }

            [DataMember]            
            [JsonProperty("error", Required = Required.Always)]
            public string Error { get; set; }

            [DataMember]            
            [JsonProperty("source", Required = Required.Always)]
            public Source Source { get; set; }
        }

        [Serializable, JsonObject, DataContract]
        public partial class Source
        {
            [DataMember]

            [JsonProperty("object", Required = Required.Always)]
            public string Object { get; set; }

            [DataMember]

            [JsonProperty("uuid", Required = Required.Always)]
            public string Uuid { get; set; }

            [DataMember]

            [JsonProperty("type", Required = Required.Always)]
            public string Type { get; set; }

            [DataMember]

            [JsonProperty("token", Required = Required.Always)]
            public string Token { get; set; }

            [DataMember]

            [JsonProperty("brand", Required = Required.Always)]
            public string Brand { get; set; }

            [DataMember]

            [JsonProperty("country", Required = Required.Always)]
            public string Country { get; set; }

            [DataMember]

            [JsonProperty("holder", Required = Required.Always)]
            public string Holder { get; set; }

            [DataMember]

            [JsonProperty("bin", Required = Required.Always)]
            public long Bin { get; set; }

            [DataMember]

            [JsonProperty("last4", Required = Required.Always)]
            public string Last4 { get; set; }

            [DataMember]

            [JsonProperty("expire_month", Required = Required.Always)]
            [JsonConverter(typeof(ParseStringConverter))]
            public long ExpireMonth { get; set; }

            [DataMember]

            [JsonProperty("expire_year", Required = Required.Always)]
            [JsonConverter(typeof(ParseStringConverter))]
            public long ExpireYear { get; set; }

            [DataMember]

            [JsonProperty("additional", Required = Required.Always)]
            public string Additional { get; set; }

            [DataMember]

            [JsonProperty("bank", Required = Required.Always)]
            public string Bank { get; set; }
        }

Это мой интерфейс:

[ServiceContract(Namespace = "Satellise.Integration.CardRegistrationWS", Name = "PGQCRMRegistrarTarjeta")]
    public interface ICreditCardRegistration
    {

        [OperationContract(Name = "RegistrarTarjeta")]
        [WebInvoke(UriTemplate = "RegistrarTarjeta/", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
        ResponsePagaqui RegistrarTarjeta(Request request);
    }

А это мой файл web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  <!-- SERVIDOR <add key="directoryLogPagaqui" value="C:\IntegrationLogEstacion\REST\" /> -->
    <!-- PRUEBAS MI MÁQUINA-->  <add key="directoryLogPagaqui" value="C:\Users\A753752\OneDrive - Atos\Documents\S A T E L I S E\prueba" />
    <add key="saveAlwaysLog" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5.2" />
    <httpRuntime targetFramework="4.5.2"/>
  </system.web>
  <system.serviceModel>
    <services>
      <service name="Satellise.Integration.CardRegistrationWS.PagaquiService" behaviorConfiguration="ServiceBehavior">
        <endpoint binding="webHttpBinding" contract="Satellise.Integration.CardRegistrationWS.ICreditCardRegistration"
                  behaviorConfiguration="webHttp"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior" >
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
        <behavior>
          <!-- Para evitar revelar información de los metadatos, establezca los valores siguientes en false antes de la implementación -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- Para recibir detalles de las excepciones en los fallos, con el fin de poder realizar la depuración, establezca el valor siguiente en true. Para no revelar información sobre las excepciones, establézcalo en false antes de la implementación -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="webHttp">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="webHttpBinding" scheme="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        Para examinar el directorio raíz de la aplicación web durante la depuración, establezca el valor siguiente en true.
        Establézcalo en false antes de la implementación para evitar revelar información sobre la carpeta de aplicación web.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>
  <system.net>
    <defaultProxy enabled="true" useDefaultCredentials="true">
      <proxy autoDetect="True" bypassonlocal="False" />
    </defaultProxy>
  </system.net>

</configuration>

Что я делаю не так? Я не могу выяснить, почему сообщение с запросом приходит как с Order, так и с клиентом null.

1 Ответ

0 голосов
/ 12 октября 2019

В конце концов я нашел причину, по которой это не сработало. Мне пришлось указать пространство имен для контракта данных.

   [DataContract (Namespace="my_namespace"]
        public partial class Source{}
...