нет ответа от WCF при возврате объекта Entity Framework - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь вернуть объект Entity Framework, сгенерированный базой данных Entity Framework сначала в службе WCF.

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

namespace HiplotSystemService.services
{
    [ServiceContract]
    public interface IServiceUsuario
    {
        [OperationContract]
        [WebInvoke(Method = "GET",
                   ResponseFormat = WebMessageFormat.Json,
                   RequestFormat = WebMessageFormat.Json,
                   BodyStyle = WebMessageBodyStyle.WrappedRequest,
                   UriTemplate = "Useru")]
        object GetUsuario();
    }
}

Мой класс обслуживания:

namespace HiplotSystemService.services
{
    public class ServiceUsuario : IServiceUsuario
    {
        public object GetUsuario()
        {
             using (HiplotSystemEntities datacontext = new HiplotSystemEntities())
             {
                 var response = datacontext.usuario.Where(x => x.id == 6).FirstOrDefault();
                 return response;
             }
         }
     }
}

Когда я звоню в службу почтальона, я не могу получить никакого ответа

Скриншот почтальона

Несмотря на то, что Visual Studio говорит, что WCF ответил кодом 200:

{
  "name": "Microsoft.ApplicationInsights.Dev.Request",
  "time": "2019-06-03T19:03:34.8763009Z",
  "tags": {
    "ai.cloud.roleInstance": "DESKTOP-5SD5F4O",
    "ai.operation.id": "6b308fdc12cc3748bf7522f1169a3c66",
    "ai.operation.name": "GET /services/ServiceUsuario.svc/Useru",
    "ai.location.ip": "::1",
    "ai.internal.sdkVersion": "web:2.10.0-32157"
  },
  "data": {
    "baseType": "RequestData",
    "baseData": {
      "ver": 2,
      "id": "|6b308fdc12cc3748bf7522f1169a3c66.5b1db8ff_",
      "name": "GET /services/ServiceUsuario.svc/Useru",
      "duration": "00:00:03.0628593",
      "success": true,
      "responseCode": "200",
      "url": "http://localhost:61768/services/ServiceUsuario.svc/Useru",
      "properties": {
        "DeveloperMode": "true",
        "_MS.ProcessedByMetricExtractors": "(Name:'Requests', Ver:'1.1')"
      }
    }
  }

Кроме того, если перед возвращением выдается исключение, я вижу ответ var и, кажется, все в порядке, он имеет правильную информацию о пользователе.У меня есть несколько методов POST, и они отлично работают

Что-то, что я уже пробовал:

  • Используйте вместо этого пользовательский тип var.
  • Настройка Configuration.LazyLoadingEnabled = false в HiplotSystemEntities.Context.cs
  • Установка base.Configuration.ProxyCreationEnabled = false в HiplotSystemEntities.Context.tt
  • Возврат только логического значения - когда я это делаю, я могу получить истину или ложь в почтальоне
  • Выберите только некоторые свойства для возврата, но все равно не получаю никакого ответа
  • Вернуть объект в виде строки, я получаю объект в ответе, но в виде строки, очевидно,

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

на самом деле есть простое решение для этого.вы можете использовать Stream вместо object в качестве выхода.Таким образом, вы можете отправить обратно объект.

return new MemoryStream(Encoding.UTF8.GetBytes("your json string"));
0 голосов
/ 04 июня 2019

Для сложных типов данных, возвращаемых в WCF, используйте контракт данных. WCF должен знать, как сериализовать и десериализовать передаваемые данные, прежде чем их использовать. Пожалуйста, обратитесь к примеру ниже.
IService1.

    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(UriTemplate ="/MyTest",Method ="GET",RequestFormat =WebMessageFormat.Json,ResponseFormat =WebMessageFormat.Json)]
        CompositeType Test();
    }


    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }

}

Service1.cs

   public CompositeType Test()
    {
        return new CompositeType()
        {
            StringValue = "Hello, busy world",
            BoolValue = true
        };
    }

Result.
enter image description here
Вот официальный документ, желаю, чтобы он был вам полезен.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-data-contracts
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

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