1

我有一个 rest wcf 4.0 服务,它接受一个 base64 编码的字符串作为参数。当我使用 casini 在 Visual Studio 中运行该服务时,它可以正常工作,但是当我在 IIS 7.5 下运行相同的服务时,它会给出错误 400 消息。断点不会被击中。我想这不是代码问题,因为它在 casini 下使用相同的代码和 web.config 工作。

我需要进行哪些更改才能使服务在 IIS 7.5 下运行?

这是网址

http://localhost/MyServices/MyServ.svc/Accept/eyJXb3JkY291bnQiOjMwLCJJbWFnZWNvdW50IjoxMCwiU2VsZWN0ZWRMYW5ndWFnZXMiOlt7ImlkIjoxLCJsYW5ndWFnZTEiOiJIaW5kaSIsIkdyb3VwX0xhbmd1YWdlc19pZCI6bnVsbH0seyJpZCI6MSwibGFuZ3VhZ2UxIjoiTWFyYXRoIiwiR3JvdXBfTGFuZ3VhZ2VzX2lkIjpudWxsfSx7ImlkIjoxLCJsYW5ndWFnZTEiOiJGcmVuY2giLCJHcm91cF9MYW5ndWFnZXNfaWQiOm51bGx9LHsiaWQiOjEsImxhbmd1YWdlMSI6IkdFcm1hbiIsIkdyb3VwX0xhbmd1YWdlc19pZCI6bnVsbH0seyJpZCI6MSwibGFuZ3VhZ2UxIjoiSXRhbGlhbiIsIkdyb3VwX0xhbmd1YWdlc19pZCI6bnVsbH0seyJpZCI6MSwibGFuZ3VhZ2UxIjoic3BhbmlzaCIsIkdyb3VwX0xhbmd1YWdlc19pZCI6bnVsbH1dfQ==

谢谢。

4

1 回答 1

2

等号在 URL 中具有特殊含义。它将参数键与其值分开。您使用尾随等号的方式,IIS 将拒绝它。

请注意,Base 64 编码在 URL 中使用了具有特殊含义并导致问题的附加字符(即+/)。因此,我建议使用仅使用 URL 安全字符的修改后的 Base 64 编码。

通常,会替换以下字符:

+-, /_, =*

更新:

您用于 Base 64 编码的 Javascript 代码很容易修改。只需替换这一行:

var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_*";

return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);

和:

return (r ? enc.slice(0, r - 3) : enc) + '***'.slice(r || 3);

更新 2:

恐怕 Base 64 URL 永远无法与 IIS 一起使用。IIS 仍将 URL 的每一部分视为文件或目录名称。这个实现有很多问题(试试 COM2 或 PRN 作为 URL 段)。

您需要提出不同的 URL 方案或请求类型。使用 POST 请求传输 Base64 编码部分或使用如下 URL:

http://server/MyServices/MyServ.svc/Accept?data=eyJXb3JkY291bnQiOjMwLCJ...VsbH1dfQ**

但是第二种情况只有在 URL 不太长的情况下才有效。它不会期望超过 1000 个字符的 URL 起作用。

于 2012-12-28T12:06:49.497 回答