从Webservice StreamReader返回一个System.Drawing.Image
本文关键字:一个 System Drawing Image Webservice StreamReader 返回 | 更新日期: 2023-09-27 18:12:14
我写了一个webservice,其中一个函数需要返回一个System.Drawing.Image
我的服务功能如下:
public class GetVisitorImageController : ApiController
{
[Route("GetVisitorImage/{id}")]
[HttpGet]
public System.Drawing.Image Get(string id)
{
string[] authorization = Request.Headers.Authorization.ToString().Split('|');
string PartnerId = Request.Headers.GetValues("PartnerId").First();
string DeviceId = Request.Headers.GetValues("DeviceId").First();
try
{
return VisitorFunctions.GetVisitorImage(authorization[0], authorization[1], id, PartnerId, DeviceId);
}
catch
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NoContent));
}
}
}
下面是我的客户端函数:
public static System.Drawing.Image GetVisitorImage(NetworkInfo networkInfo, string partnerId, string deviceId, string visitorId)
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(AcceptAllCertifications);
var httpWebRequest = (HttpWebRequest)WebRequest.Create(networkInfo.baseUrl + "GetVisitorImage" + "/" + visitorId);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "GET";
httpWebRequest.Headers.Add("Authorization", "" + networkInfo.userName + "|" + networkInfo.userPassword + "");
httpWebRequest.Headers.Add("PartnerId", partnerId);
httpWebRequest.Headers.Add("DeviceId", deviceId);
httpWebRequest.Proxy = ConfigureProxy(networkInfo);
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
return JsonConvert.DeserializeObject<System.Drawing.Image>(result);
}
}
正如你可能看到的,我已经尝试使用Json库将StreamReader的结果转换为System.Drawing.Image
我感觉json库不能做我想做的事情。
我可以转换StreamReader字符串"结果"并将其作为System.Drawing.Image返回吗?
谢谢
你不能简单地将System.Drawing.Image序列化为Json,然后将Json反序列化回System.Drawing.Image。Json只是序列化对象的公共属性,System.Drawing.Image是GDI2库的包装器。
相反,你应该保存你的System.Drawing.Image到一个字节数组,使用一些图像编码器(jpg或png),并从GetVisitorImage操作返回字节数组。在客户端,你读取所有的字节(在ResponseStream上使用ReadToEnd)并渲染它们,或者你仍然可以选择从你的流中重建你的System.Drawing.Image -如果你真的需要一个System.Drawing.Image.
我完全不熟悉webAPI,所以我不完全确定在你的webAPI方法中声明这个的最好方法是什么。
以防有人像我一样被卡住。
这是我如何修复它。
基本上,在服务中,我将图像转换为base64字符串并返回。
在客户端,我将返回的base64字符串转换回System.Drawing.Image
这是新的Service controller:
public class GetVisitorImageController : ApiController
{
[Route("GetVisitorImage/{id}")]
[HttpGet]
public string Get(string id)
{
string[] authorization = Request.Headers.Authorization.ToString().Split('|');
string PartnerId = Request.Headers.GetValues("PartnerId").First();
string DeviceId = Request.Headers.GetValues("DeviceId").First();
System.Drawing.Image visitorimage = VisitorFunctions.GetVisitorImage(authorization[0], authorization[1], id, PartnerId, DeviceId);
MemoryStream memStream = new MemoryStream();
visitorimage.Save(memStream, ImageFormat.Jpeg);
byte[] imageBytes = memStream.ToArray();
string base64String = Convert.ToBase64String(imageBytes);
return base64String;
}
}
这是新的客户端函数
public static System.Drawing.Image GetVisitorImage(NetworkInfo networkInfo, string partnerId, string deviceId, string visitorId)
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(AcceptAllCertifications);
var httpWebRequest = (HttpWebRequest)WebRequest.Create(networkInfo.baseUrl + "GetVisitorImage" + "/" + visitorId);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "GET";
httpWebRequest.Headers.Add("Authorization", "" + networkInfo.userName + "|" + networkInfo.userPassword + "");
httpWebRequest.Headers.Add("PartnerId", partnerId);
httpWebRequest.Headers.Add("DeviceId", deviceId);
httpWebRequest.Proxy = ConfigureProxy(networkInfo);
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
result = result.Remove(0, 1); // remove first character
result = result.Remove(result.Length - 1); // remove last character
byte[] imageBytes = Convert.FromBase64String(result);
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
ms.Write(imageBytes, 0, imageBytes.Length);
Image image = Image.FromStream(ms, true);
return image;
}
}