【问题标题】:what is wrong with this ServiceStack Put method这个 ServiceStack Put 方法有什么问题
【发布时间】:2013-12-16 22:22:35
【问题描述】:

客户端连接,发送Put:

var client = new JsvServiceClient(ConfigGlobal.Host);
client.Put(new PiecParametrySzczegoloweRequest { Initialize = true, Config = _config });

服务器收到调用,看不到Initialize变量值设置为true

internal class PiecParametrySzczegoloweService : Service
{
    public PiecParametrySzczegoloweResponse Put(PiecParametrySzczegoloweRequest request)
    {
        if (request.Initialize)
        {
            ImageFile.Initialize(request.Config);

            request.Initialize = false;

            return new PiecParametrySzczegoloweResponse { Initialized = true };
        }

        return null;
    }
}

请求看起来像:

[DataContract]
[Route("/PiecParametrySzczegolowe")]
public class PiecParametrySzczegoloweRequest : IReturn<PiecParametrySzczegoloweResponse>
{
    public bool Initialize { get; set; }

    public PiecParametrySzczegoloweLegend Config { get; set; }

    public int Percent { get; set; }
}

编辑:

缺少属性,谢谢!并且(同时解决的问题)...

如果你需要 /requestlogs 而你没有授权使用:

Plugins.Add(new RequestLogsFeature() { RequiredRoles = new string[0] });

如果您需要序列化二进制数据(位图),请使用 protobuf-net (var client = new ProtoBufServiceClient(ConfigGlobal.Host);) 并执行类似 Serialize a Bitmap in C#/.NET to XML 的操作

如果您不想(需要)注释每个字段成员(阅读警告)Protobuf-net serialization without annotation

【问题讨论】:

  • 您使用的是什么版本的 ServiceStack?我重新创建了您的服务,但无法重现该错误。 Initialize 值对我来说设置为 true。当您在if(request.Initialize) 行上断点时,其他请求参数是否设置正确?你使用代理吗?尝试添加请求日志插件Plugins.Add(new RequestLogsFeature());,然后检查/requestlogs
  • 我正在使用没有代理的 ServiceStack.3.9.68。我会尝试请求日志
  • 3.9.71 是最新的 BSD 版本。但是,一旦您看到请求,您的问题可能会变得清晰。
  • @Scott 更新到最新,/requestlogs 显示 Connection Keep-Alive Content- Length 2 Content- Type application/jsv Accept application/jsv Accept- Encoding gzip Expect 100-continue Host localhost:1337, other列(项目和持续时间除外)为空。
  • 我突然想到删除[DataContract] 属性,因为您没有定义[DataMember]s,所以它没有正确序列化对象。

标签: c# rest servicestack protobuf-net


【解决方案1】:

您需要删除[DataContract] 属性,因为该属性告诉序列化程序您将使用[DataMember] 属性指定要包含的字段以进行序列化,但您还没有这样做。

或者使用[DataMember]标记您的属性。

[DataContract]
[Route("/PiecParametrySzczegolowe")]
public class PiecParametrySzczegoloweRequest : IReturn<PiecParametrySzczegoloweResponse>
{
    [DataMember]
    public bool Initialize { get; set; }

    [DataMember]
    public PiecParametrySzczegoloweLegend Config { get; set; }

    [DataMember]
    public int Percent { get; set; }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
相关资源
最近更新 更多