WCF проблема прохождения сложного type_either работала с invoke - PullRequest
0 голосов
/ 23 сентября 2019

Я хочу передать сложный тип (список целых чисел и другие целые числа) в моем сервисе wcf.вот мой сервис:

    [OperationContract]        
     [WebInvoke(Method = "Get", UriTemplate = "GetUserByID")]    
    List<User> GetUserByID(UserIdParams userIdParams);

Это мой тип класса:

public class UserIdParams : CommonParams
{
    [DataMember]
    public int UserId { get; set; }
    [DataMember]
    public List<int> ListUserId { get; set; }
}
  • Если я тестирую его с WCF Test Client, все в порядке, это сработалоenter image description here

  • но если я проверю его с почтальоном, у меня будет ошибка!enter image description here

  • Элемент списка

*** Поведение:

 <behavior name="restBehavior">
      <webHttp helpEnabled="true"/>  
    </behavior>

XML тестового клиента WCF:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpsBinding_IServiceDataExtractor" 
  sendTimeout="00:05:00">
                <security mode="Transport" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint 
 address="https://localhost:44310/ServiceDataExtractor.svc/soap"
            binding="basicHttpBinding" 
bindingConfiguration="BasicHttpsBinding_IServiceDataExtractor"
            contract="IServiceDataExtractor" 
 name="BasicHttpsBinding_IServiceDataExtractor" />
    </client>
</system.serviceModel>
</configuration>

Так как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

Большое спасибо за dnxit, он предложил мне решение, всегда работая с GET,

  • Мой старый класс:

    public class UserIdParams : CommonParams
    {
    [DataMember]
    public int UserId { get; set; }
    [DataMember]
    public List<int> ListUserId { get; set; }     
    }
    
  • и старый сервис:

    [OperationContract]        
    [WebInvoke(Method = "Get", UriTemplate = "GetUserByID")]    
    List<User> GetUserByID(UserIdParams userIdParams);
    

Теперь для исправления этой ошибки и работы выполните WCF REST с параметром Array: * модифицированный класс:

public class UserIdParams : CommonParams
{
    [DataMember]
    public int UserId { get; set; }
    [DataMember]     
    public string DelimitedUserIds { get; set; }
}
  • модифицированный сервис:

    [OperationContract]        
    [WebGet(UriTemplate = "GetUserByID?DelimitedUserIds={DelimitedUserIds}")]
    List<User> GetUserByID(string DelimitedUserIds);
    

И самое главное - добавить: (пример)

 string DelimitedUserIds = "9,3,12,43,2"
 List<int> UserIds = DelimitedUserIds .Split(',').Select(int.Parse).ToList();
0 голосов
/ 25 сентября 2019

Я думаю, вы обнаружили, что с помощью стиля restful службы WCF метод Get не поддерживает использование сложных объектов в качестве параметров по умолчанию, поэтому, пожалуйста, рассмотрите возможность использования метода post / put.Это также не соответствует руководящим принципам разработки для метода HTTP get.
https://blogs.msdn.microsoft.com/carlosfigueira/2011/08/08/wcf-extensibility-querystringconverter/
Кроме того, Postman обычно используется для тестирования служб restful.
Вот конфигурация, которая применяется к службе WCF restful style.

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    <endpointBehaviors>
      <behavior>
        <webHttp helpEnabled="true"/>
      </behavior>
    </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <protocolMapping>
      <add binding="webHttpBinding" scheme="http"/>
    </protocolMapping>
  </system.serviceModel>

Не стесняйтесь, дайте мне знать, если я могу чем-то помочь.

0 голосов
/ 23 сентября 2019

Тестовый клиент WCF протестирует эту операцию как Сервис SOAP , а не Сервис покоя . Пожалуйста, обратитесь вкладка XML в тестовом клиенте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...