Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC:如何将字符串作为JSON返回_Asp.net Mvc_Json - Fatal编程技术网

Asp.net mvc MVC:如何将字符串作为JSON返回

Asp.net mvc MVC:如何将字符串作为JSON返回,asp.net-mvc,json,Asp.net Mvc,Json,为了使进度报告过程更加可靠并与请求/响应分离,我在Windows服务中执行处理,并将预期的响应持久化到文件中。当客户端开始轮询更新时,其目的是控制器将文件的内容作为JSON字符串返回,不管它们是什么 文件内容预序列化为JSON。这是为了确保响应过程中没有任何障碍。无需进行任何处理(将文件内容读入字符串并返回)即可获得响应 我起初认为这相当简单,但事实并非如此 目前,我的控制器方法看起来非常: 控制器 更新 Fiddler将此作为原始响应返回 HTTP/1.1 200 OK Server: ASP

为了使进度报告过程更加可靠并与请求/响应分离,我在Windows服务中执行处理,并将预期的响应持久化到文件中。当客户端开始轮询更新时,其目的是控制器将文件的内容作为JSON字符串返回,不管它们是什么

文件内容预序列化为JSON。这是为了确保响应过程中没有任何障碍。无需进行任何处理(将文件内容读入字符串并返回)即可获得响应

我起初认为这相当简单,但事实并非如此

目前,我的控制器方法看起来非常:

控制器 更新 Fiddler将此作为原始响应返回

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Mon, 19 Mar 2012 20:30:05 GMT
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 3.0
Cache-Control: private
Content-Type: application/json; charset=utf-8
Content-Length: 81
Connection: Close

"{\"StopPolling\":false,\"BatchSearchProgressReports\":[],\"MemberStatuses\":[]}"
AJAX 更新 下面的内容可能会在以后更改,但就目前而言,当我生成响应类并像普通人一样以JSON的形式返回时,这是可行的

this.CheckForUpdate = function () {
var parent = this;

if (this.BatchSearchId != null && WorkflowState.SelectedSearchList != "") {
    showAjaxLoader = false;
    if (progressPending != true) {
        progressPending = true;
        $.ajax({
            url: WorkflowState.UpdateBatchLink + "?SearchListID=" + WorkflowState.SelectedSearchList,
            type: 'POST',
            contentType: 'application/json; charset=utf-8',
            cache: false,
            success: function (data) {
                for (var i = 0; i < data.MemberStatuses.length; i++) {
                    var response = data.MemberStatuses[i];
                    parent.UpdateCellStatus(response);
                }
                if (data.StopPolling = true) {
                    parent.StopPullingForUpdates();
                }
                showAjaxLoader = true;
            }
        });
        progressPending = false;
    }
}
this.CheckForUpdate=函数(){
var parent=此;
if(this.BatchSearchId!=null&&WorkflowState.SelectedSearchList!=“”){
showAjaxLoader=false;
if(progressPending!=真){
progressPending=true;
$.ajax({
url:WorkflowState.UpdateBatchLink+“?SearchListID=“+WorkflowState.SelectedSearchList,
键入:“POST”,
contentType:'application/json;charset=utf-8',
cache:false,
成功:功能(数据){
对于(变量i=0;i
我认为,问题在于Json操作结果旨在获取一个对象(您的模型)并创建一个HTTP响应,其中的内容是来自模型对象的Json格式的数据

但是,您传递给控制器的Json方法的是一个Json格式的字符串对象,因此它将字符串对象“序列化”为Json,这就是HTTP响应的内容被双引号包围的原因(我假设这就是问题所在)

我认为您可以考虑使用Content action结果作为Json action结果的替代方案,因为您基本上已经拥有HTTP响应的原始内容

return this.Content(returntext, "application/json");
// not sure off-hand if you should also specify "charset=utf-8" here, 
//  or if that is done automatically

另一种方法是将服务的JSON结果反序列化为一个对象,然后将该对象传递给控制器的JSON方法,但缺点是您将对数据进行反序列化,然后重新序列化,这对于您的目的可能是不必要的。

您只需要返回标准ContentResultnd将ContentType设置为“application/json”。 您可以为其创建自定义ActionResult:

public class JsonStringResult : ContentResult
{
    public JsonStringResult(string json)
    {
        Content = json;
        ContentType = "application/json";
    }
}
然后返回其实例:

[HttpPost]
public JsonResult UpdateBatchSearchMembers()
{
    string returntext;
    if (!System.IO.File.Exists(path))
        returntext = Properties.Settings.Default.EmptyBatchSearchUpdate;
    else
        returntext = Properties.Settings.Default.ResponsePath;

    return new JsonStringResult(returntext);
}

是的,就是这样,没有其他问题,为了避免原始字符串json,就是这样

    public ActionResult GetJson()
    {
        var json = System.IO.File.ReadAllText(
            Server.MapPath(@"~/App_Data/content.json"));

        return new ContentResult
        {
            Content = json,
            ContentType = "application/json",
            ContentEncoding = Encoding.UTF8
        };
    } 

注意:请注意,
JsonResult
的方法返回类型对我不起作用,因为
JsonResult
ContentResult
都继承了
ActionResult
,但它们之间没有任何关系。

这里的所有答案都提供了良好且有效的代码。但有些人会不满意他们都使用了
>ContentType
作为返回类型,而不是
JsonResult

不幸的是,
JsonResult
正在使用
JavaScriptSerializer
而没有禁用它的选项。最好的解决方法是继承
JsonResult

我从原始的
JsonResult
复制了大部分代码,并创建了
JsonStringResult
类,该类以
application/json
的形式返回传递的字符串

public class JsonStringResult : JsonResult
    {
        public JsonStringResult(string data)
        {
            JsonRequestBehavior = JsonRequestBehavior.DenyGet;
            Data = data;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }
            if (JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
                String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
            {
                throw new InvalidOperationException("Get request is not allowed!");
            }

            HttpResponseBase response = context.HttpContext.Response;

            if (!String.IsNullOrEmpty(ContentType))
            {
                response.ContentType = ContentType;
            }
            else
            {
                response.ContentType = "application/json";
            }
            if (ContentEncoding != null)
            {
                response.ContentEncoding = ContentEncoding;
            }
            if (Data != null)
            {
                response.Write(Data);
            }
        }
    }
用法示例:

var json = JsonConvert.SerializeObject(data);
return new JsonStringResult(json);

在控制器中使用以下代码:

return Json(new { success = string }, JsonRequestBehavior.AllowGet);
在JavaScript中:

success: function (data) {
    var response = data.success;
    ....
}

您不能只返回字符串,还需要将返回类型更改为字符串。您使用什么进行Ajax调用(jQuery、custom、dojo)?您能提供该代码吗?我看不到您在控制器操作中的任何地方使用此
路径
变量。您在哪里读取文件的内容?您所做的只是返回一个JSON,其中包含
属性.Settings.Default.EmptyBatchSearchUpdate
属性的内容。您是否意识到在执行此操作时无法读取文件另一个线程正在写入它?至少这不可能以安全的方式发生。您可能会很快遇到竞争条件。因此,我认为您的设计从一开始就是有缺陷的。@Paul我正在使用Ajax,我将在一分钟内发布它。上面的代码已编辑,我将在一秒钟内更改它。在fiddler返回中看到的返回值准确地表示nts正确地转义了我试图响应的JSON对象的C#字符串。是的,我已经遇到了这方面的问题,并已采取措施在Windows服务中阻止它。谢谢!+1:您还需要将结果的ContentType属性设置为“application/JSON”,因为这是JsonResult自动执行的。@StriplingWarrior很好的一点,我将更新我的代码示例以使用其他内容方法重载。值得注意的是,
Content
正在返回
ContentResult
,其中
Json
正在返回
JsonResult
。这是,尽管它最大的好处是重新加载se.我只需要一个单独的响应。但是,如果将来我在其他地方需要它,我会完全按照这个答案的路线来回答。谢谢你的新答案,但这并不真正符合原始问题。我已经预先生成了我想要返回的JSON数据,而不是我想要用JSON ob的字符串值表示的数据另外,请注意
success: function (data) {
    var response = data.success;
    ....
}