문제

호출하는 기능에 따라 XML 또는 JSON 데이터를 반환하는 웹 애플리케이션에 사용하는 ASP.NET 웹 서비스가 있습니다. 이것은 지금까지 잘 작동했지만 문제가 발생했습니다. JSON 파일을 다운로드 할 페이지에 "내보내기"링크를 만들고 싶습니다. 링크는 매우 간단하게 형식화됩니다.

<a href="mywebserviceaddress/ExportFunc?itemId=2">Export This Item</a>

당신이 상상할 수 있듯이, 이것은 항목 2를 수출해야합니다. 지금까지 너무 좋았습니까?

문제는 허용 된 컨텐츠 유형이 JSON이라는 요청을 구체적으로 요청하지 않기 때문에 ASP.NET은 XML 이외의 것을 다시 보내기를 거부합니다.이 상황에는 적합하지 않습니다. 코드는 본질적으로 다음과 같습니다.

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public Item ExportItem(int itemId)
    {
        Context.Response.AddHeader("content-disposition", "attachment; filename=export.json"); //Makes it a download

        return GetExportItem(itemId);
    }

ResponseFormat을 JSON으로 지정했지만 AJAX (Google Web Toolkit, BTW 사용)를 통해이 메소드를 요청하지 않는 한 항상 XML을 다시 얻습니다.

    RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, "mywebserviceaddress/ExportFunc");
    builder.setHeader("Content-type","application/json; charset=utf-8");
    builder.setHeader("Accepts","application/json");
    builder.sendRequest("{\"itemId\":2}", new RequestCallback(){...});

훌륭하지만 Ajax는 다운로드 대화 상자를 제공하지 않습니다. 데이터가 어떻게 요청되는지에 관계없이 ASP.net을 강제로 JSON을 돌려 주도록 강요하는 방법이 있습니까? 이 동작에 대한 수동 재정의가없는 것은 심한 디자인 감독 인 것 같습니다.


빠른 답변 :

우선, WOMP의 대답은 아마도 장기적으로 갈 수있는 더 좋은 방법 (WCF로 변환)이라고 생각하지만, DeOStroll은 즉시 미래에 사용할 대답으로 이끌었습니다. 또한, 이것은 주로 다운로드를 원했기 때문에 주로 작동하는 것 같습니다. 모든 상황에서는 잘 작동하지 않을 수 있습니다. 어쨌든 여기에 내가 원하는 결과를 얻기 위해 사용한 코드가 있습니다.

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public void ExportItem(int itemId)
    {
        Item item = GetExportItem(itemId);            

        JavaScriptSerializer js = new JavaScriptSerializer();
        string str = js.Serialize(item);

        Context.Response.Clear();
        Context.Response.ContentType = "application/json";
        Context.Response.AddHeader("content-disposition", "attachment; filename=export.json");
        Context.Response.AddHeader("content-length", str.Length.ToString());
        Context.Response.Flush();
        Context.Response.Write(str);
    }

반환 유형에 유의하십시오 무효의 (이 기능의 WDSL이 쓸모가 없다는 것을 의미합니다). 무엇이든 반환하면 손으로 만든 응답을 망칠 수 있습니다.

도움이 되었습니까?

해결책

참조를위한 두 가지 포럼 스레드는 다음과 같습니다.

http://forums.asp.net/t/1118828.aspx

http://forums.asp.net/p/1054378/2338982.aspx#2338982

분명한 생각이 없습니다. 그들은 컨텐츠 유형을 Application/JSON으로 설정하는 데 집중한다고 말합니다. 전에는 WCF와 함께 일하지 않았지만 응답 객체를 사용할 수 있다고 생각합니다.

응답 객체에서 컨텐츠 유형을 설정하십시오. 응답을 수행하십시오. JSON 데이터를 문자열로 전달한 다음 응답을 수행하십시오.

다른 팁

ASP.NET 웹 서비스는 비누 기반 웹 서비스입니다. 그들은 항상 XML을 반환합니다. Ajax 라이브러리가 나왔고 ScriptMethod 물건이 소개되었지만 기본 개념을 변경하지는 않습니다.

당신이 할 수있는 몇 가지 일이 있습니다.

WebMethods는 WCF의 도입으로 경계선입니다. 당신은 고려할 수 있습니다 웹 서비스를 WCF로 마이그레이션합니다, 출력 형식을 훨씬 더 많이 제어 할 수 있습니다.

그렇게하고 싶지 않다면 웹 서비스 호출 결과를 JSON으로 수동으로 직렬화 할 수 있으며 서비스가 비누 헤더로 랩핑됩니다. 그런 다음 비누 물건을 제거해야합니다.

이전에 언급되지 않았기 때문에 이것을 버릴 것이라고 생각했습니다 ... asp.net 3.5와 함께 웹 서비스를 사용하면 JSON이 기본 반환 형식입니다. 또한 JSON 시리얼 라이저와 함께 제공되므로 JavaScriptTerializer 사용을 중단 할 수 있습니다.

이 기사 Rick Strahl의 블로그는 서버 측 클래스와 클라이언트의 JSON 객체간에 할 수있는 강력한 변환에 대해 이야기합니다.

나는 최근 .NET 3.5 에서이 새로운 JSON 물건을 사용하여 프로젝트를 완료했으며 성능에 깊은 인상을 받았습니다. 아마도 볼만한 가치가있을 것입니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top