首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Webservice StreamReader返回一个StreamReader

从Webservice StreamReader返回一个StreamReader
EN

Stack Overflow用户
提问于 2014-07-09 12:52:47
回答 2查看 991关注 0票数 0

我编写了一个webservice,其中一个函数需要返回一个System.Drawing.Image。

这是我的服务功能:

代码语言:javascript
复制
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));
        }
    }
}

这是我的客户功能:

代码语言:javascript
复制
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返回吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-10 08:35:24

以防有人像我一样被困住了。

我就是这样修好的。

基本上,在服务中,我将图像转换为base64字符串并返回该字符串。

在客户机中,我将返回的base64字符串转换为System.Drawing.Image。

这是新的服务控制器:

代码语言:javascript
复制
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;
    }
}

这是新的客户端功能

代码语言:javascript
复制
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;
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2014-07-09 13:11:44

不能简单地将System.Drawing.Image序列化为Json,然后反序列化json返回到System.Drawing.Image。Json只是序列化对象的公共属性,System.Drawing.Image是GDI2库的包装器。

相反,您应该使用一些图像编码器(jpg或png)将您的System.Drawing.Image保存到一个字节数组中,并从您的GetVisitorImage操作中返回该字节数组。在客户端,读取所有字节(在ResponseStream上使用ResponseStream)并呈现它们,或者仍然可以选择从流中重构System.Drawing.Image --如果确实需要System.Drawing.Image的话。

我对webAPI完全不熟悉,所以我不完全确定在您的webAPI方法中声明这一点的最佳方法是什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24654244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档