我正在我的wp7应用程序中将图像转换为客户端的字节数组,然后将其发送到 一个Web服务(服务器),代码如下所示--->
客户端
private void SendImage(byte[] data, long UserID)
{
Uri uri = new Uri("some uri");
IDictionary<string, object> bytesToSend = new Dictionary<string, object>();
bytesToSend.Add("ImageBytes", Convert.ToBase64String(data));
PostClient post = new PostClient(bytesToSend);
post.DownloadStringAsync(uri);
}
服务器端
[HttpPost]
public bool SaveImage(object ImageBytes, Int64 UserID = 1)
{
string ImgStr = ((string[])(ImageBytes))[0];
byte[] ImgBytes = Convert.FromBase64String(ImgStr); ///<----///ERROR
Image ItemImage;
using (MemoryStream ms = new MemoryStream(ImgBytes))
{
ItemImage = Image.FromStream(ms);
}
PostUserItems(ItemImage);
return true;
}
但在接收端发生错误
base 64 char数组的长度无效
答案 0 :(得分:0)
您的数据是以String形式出现的,而不是String []。您可以修复演员表,而不是
string ImgStr = ((string[])(ImageBytes))[0];
DO
string ImgStr = (string)ImageBytes;
如果可以,请更改函数声明,因为您的函数需要String
,而不是Object
。
public bool SaveImage(String ImgStr, Int64 UserID = 1)
{
byte[] ImgBytes = Convert.FromBase64String(ImgStr);
// ...
}
答案 1 :(得分:0)
base64编码字符串的长度始终是4的倍数。如果它不是4的倍数,则会追加=字符,直到它为止。当值包含= charaters(其中一些将被删除,我不记得确切的行为)时,形式为?name = value的查询字符串会出现问题。在执行base64解码之前,您可以通过附加正确数量的=字符来逃避。
编辑1
您可能会发现UserNameToVerify的值已经&#34; +&#34;已更改为&#34; &#34;所以你可能需要这样做;
a = a.Replace(&#34;&#34;,&#34; +&#34;); 这应该是正确的长度;
int mod4 = a.Length%4; if(mod4&gt; 0)
{
a + =新字符串(&#39; =&#39;,4 - mod4);
}
当然,调用UrlEncode(如LukeH&#39的答案)应该让这一切都没有用。
答案 2 :(得分:-1)
我已经看到这种错误是由大小合适的视图状态和过度激进的内容过滤设备/防火墙组合而造成的(特别是在与K-12教育机构打交道时)。
我们通过在SQL Server中存储Viewstate来解决它。在走这条路线之前,我建议尝试限制你对viewstate的使用,不要在其中存储任何大的东西,并为所有不需要它的控件关闭它。
在SQL Server中存储ViewState的引用: MSDN - PageStatePersister概述 ASP Alliance - 在SQL Server中存储viewstate的简单方法 代码项目 - ViewState Provider Model