Return 类型是 byte[] 而不是 web 服务中的 INT

Return type is byte[] instead of INT in webservices

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

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

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

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

这一行 returns 正确数据:

results.Properties["userStatus"][0]

Value = 1(returns整数)

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

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

results.Properties["userStatus"][0]

对于同一用户,现在的值相同 returning

{byte1} [0]: 49

如果我将状态设置为 2 它将 return

{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);
}

所以,我以前也遇到过类似的问题。作为一个 int,这些是正确的结果,但它的字面版本是 +48(如果您保持在 0-9 范围内),因为这是字符代码中数字的开始位置。如果你减去 48,你将在前 10 位数字内得到答案,一旦你克服了这一点,获取信息就会变得更加疯狂。

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

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