【问题标题】:Cannot upload a file to a webservice and get the response in Json format无法将文件上传到 Web 服务并获取 Json 格式的响应
【发布时间】:2010-08-10 11:39:45
【问题描述】:

我有一个简单的网络服务,我想将文件上传到。问题是我需要 json 格式的响应。

根据我的经验,为了在 Json 中获得响应,我的请求必须具有“应用程序/json”的内容类型。但是,文件上传当然不能这样,因为内容类型必须是“multipart/form-data”。

在我的 Json 中,我想返回一个显示是否成功的值和一个文件名。

[WebMethod(EnableSession = true)]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public TyoeOfSomeObject UploadFile()
{
    // Get the file from the context and do something with it
    HttpPostedFile httpPostedFile = HttpContext.Current.Request.Files[0];

    // Return either a string or an object to serialise with the required values
    return SomeObject;
}

【问题讨论】:

    标签: asp.net web-services json file-upload


    【解决方案1】:

    我遇到了同样的问题,通过设置响应的 ContentType 并调用响应的 Write() 函数解决了它:

    C#

    String j = jsonParser.AsJson(obj);
    Context.Response.ContentType = "application/json; charset=utf-8";
    Context.Response.Write(j);
    

    VB

    Dim j As String = jsonParser.AsJson(obj)
    Context.Response.ContentType = "application/json; charset=utf-8"
    Context.Response.Write(j)
    

    【讨论】:

      【解决方案2】:

      您可以将函数的返回类型设置为字符串,然后使用一些 JSON 序列化程序将您的对象序列化为 JSON 并将其作为 JSON 字符串返回。对于 JSON 序列化,我使用 Jayrock 我相信 ASP .NET 现在也有自己的 JSON 库。

      【讨论】:

      • 抱歉,请将 Context.Response.ContentType 设置为您需要的任何值 =)
      • 响应类型还是 text/xml
      【解决方案3】:

      您可以使用byte[] 作为输出参数来声明您的网络方法。然后你可以设置ContentType并返回你想要的任何数据。

      如果您使用 WCF 而不是 ASMX Web 服务,您可以在这种情况下返回 StreamMessage(请参阅 Returning raw json (string) in wcf。如果您的文件非常大。可能它也适用于 ASMX Web 服务。

      ASP.Net Webservice Serialization

      【讨论】:

      • WCF 不是一个选项。为什么要将输出参​​数设置为 Byte[]。你是说输入参数吗?
      • 指定 byte[] 的输入参数会导致以下错误:请求格式无效:multipart/form-data。
      • 我找不到设置响应内容类型的简单方法。只有一个自定义的IHttpModule似乎我目前是一个可能的解决方案。因此,如果您使用 ajax,我会建议您再一次在 WFC 中实现 UploadFile 函数,而不是 ASMX Web 服务。您可以在同一个网站上混合使用 ASMX、WFC、MVC 等页面。 WCF 中的代码不像 ASMX 代码那样长且复杂。拥有像“MyService.asmx/UploadFile”这样的 URL 而不是“MyService.svc/UploadFile”这样重要吗?
      • 您不应从 ASMX Web 服务调用 WCF,而应直接将 url 与 WCF Web 服务一起使用,例如“MyService.svc/UploadFile”。然后,如果 WCF 方法返回 Stream 它可以将 ContentType 更改为您想要的任何内容并返回数据流。如果您已经有数据作为文件,您不需要读取内存中的内容,只需在 FileStream 中打开文件并返回 FileStream,设置transferMode="Streamed"maxReceivedMessageSize(参见msdn.microsoft.com/en-us/library/ms789010.aspx)。如果您在实现中遇到问题,请发布代码示例,我会尽力帮助您。
      【解决方案4】:

      我无法找到以 json 格式返回响应的方法。如果不修补内部工作原理,我认为这是不可能的。我使用的解决方案是创建一个可以处理文件的 aspx,您当然可以使用 .ashx 或 WCF,如 OLEG 所述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-04
        • 2014-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多