【问题标题】:Return type is byte[] instead of INT in webservices返回类型是 byte[] 而不是 webservices 中的 INT
【发布时间】:2015-06-25 19:06:31
【问题描述】:

我在 Active Directory 轻量级目录服务中有一个整数属性。

在我的webservices 中,我访问该属性并读取它的值。

...
SearchResult results = searcher.FindOne();

if (results !=null)
{
   if (results.Properties["userStatus"] != null)
   {
      user.Status = (UserStatusEnum) results.Properties["userStatus"][0];
   } 
}
...

这行返回正确的数据:

results.Properties["userStatus"][0]

Value = 1(返回整数)

但是,当我将外部 Web 服务指向内部服务时,我遇到了问题。

当我这样做并执行这一行时:

results.Properties["userStatus"][0]

对于同一个用户,它现在返回的值相同

{byte1} [0]: 49

如果我将状态设置为2,它将返回

{byte1} [0]:50

等等……

为什么会这样?我该如何解决这个问题,或者至少调试一下?

我已尝试将我的 external 网络服务从等式中删除,并将我的 web application 直接指向 internal 网络服务。我得到了相同的结果。

已解决

感谢 ps2goat 我写了一些代码来完成我需要的。我仍然有兴趣了解“为什么使用内部网络服务可以正常工作,但我们使用外部网络服务调用它时却不行?!

object statusObj = results.Properties["userStatus"][0];
if (statusObj is byte[])
{
   string statusString System.Text.Encoding.Default.GetString((byte[])statusObj);
   user.Status = (UserStatusEnum)Convert.ToInt32(statusString);
}
else
{ 
   user.Status = (UserStatusEnum)Convert.ToInt32(statusObj);
}

【问题讨论】:

  • 49 是整数 1 的 ascii 值。看起来您需要将其转换回 charklcconsulting.net/ascii.htm 看十进制值 49。所以如果用户值为 10,也许它会返回 {49, 48} 为 1 和 0。
  • @ps2goat,如果为 1,则返回 49,如果为 2,则返回 50,如果为 3,则返回 51,依此类推...我尝试将其转换为 @ 987654343@ 但我得到Invalid object cast
  • 对,检查 10 返回的内容。如果将10的字符串值转换为字节,则在ascii中为{49,48}。我链接到的那个表有一个十进制(字节)值到字符值的列表。一旦你达到两位数,你就可以看到真正的模式。
  • @ps2goat,你是对的。 10 的值返回 {byte[2]}[0]: 49 [1]:48 我确实看到了这种模式。但不幸的是,我无法将byte 转换为char
  • 我会说Web服务合同有问题,然后(WSDL)。或者这是一个 RESTful 服务等?请向我们提供更多信息。

标签: c# web-services integer type-conversion byte


【解决方案1】:

49 是整数 1 的 ASCII 值。看起来您需要将字节值转换回chars,然后再转换为ints。

这里有一个 ASCII 表可供参考:klcconsulting.net/ascii.htm 查看十进制值 49 以查看它是 ASCII 字符 1 的十进制值。如果用户值为10,它应该返回两个字节{49, 48},第一个为1,第二个为0

【讨论】:

    【解决方案2】:

    所以,我之前不得不处理类似的问题。作为一个整数,这些是正确的结果,但它的文字版本是 +48(如果你保持在 0-9 范围内),因为这是字符代码中的数字开始的地方。如果你减去 48,你会在前 10 位数内得到答案,一旦你克服了这个问题,获取信息就会变得有点疯狂。

    【讨论】:

    • 我确实看到了一种模式,我可以想出一个解决方案,但是,为什么会这样?我应该得到1
    • 这取决于您如何看待这些位,如果您将它们作为原始打印,它可能会假定它是一个字符串文字并自动将其转换为 char。
    • 我尝试将其存储到char 并将我的结果转换为char,没有运气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多