2009-10-14 2 views
7

WCF를 통해 익명 형식을 반환하고 싶습니다. 이것이 가능한가?WCF 및 익명 형식

+0

어떻게 클라이언트가 알 수 있을까 어떤 타입이 될까요? –

+0

형식이 지정되지 않은 계약 –

+2

을 사용하는 경우에도 _ 할일이 _ 생합니다. 다음은 누군가가 이것을 필요로하는 몇 가지 이유입니다. 1. 클라이언트가 Javascript로 JSON 응답을 처리 할 수 ​​있습니다. 어쨌든 유형에 대해 알지 못합니다. 2. 많은 응답 유형을 유지할 필요없이 WCF에 '일반'요청을 할 수 있어야합니다. 지금까지 가능한 (긍정적 인) 대답 (@ dave-ward)은 실제로 이것을 가능하게하는 구성 세부 사항이 부족한 것처럼 보입니다. – tishma

답변

0

아니요, 아닙니다. 미리 유형을 정의해야합니다.

+0

좋습니다. 이해합니다. 그러나이 경우 MyObj 유형을 정의하고 해당 멤버를 IsRequired = false로 표시하면 멤버 중 일부만 사용하여 MyObj 인스턴스 전체를 보내려면 어떻게해야합니까? 이것이 가능한가?? –

+0

Eugene Osovetsky 또는 marc_s의 답변을 참조하십시오. 두 경로 중 하나를 사용하면 도움이됩니다. 난 marc_s의 대답이 아마도 당신의 문제에 대한 당신의 최선이라고 말할 수 있습니다. – Randolpho

3

에서 익명 유형을 반환 할 수 없습니다. 방법을 사용 할 수 있습니까? 그렇다면 왜 WCF에서 반환 할 수 있습니까?

+0

나는이 downvote을 이해하지 못한다 - John은 절대적으로 옳다. 익명의 타입은 어떤 .NET 메소드에서도 반환 될 수 없다. 왜 응답 100 %의 downvote ...... –

+0

전적으로. 익명 형식을 "개체"로 반환 할 수 있으며이 방법은 웹 API 및 JSON serializer에서 올바르게 작동합니다. –

+0

이 질문은 일반적으로 WCF에 관한 것이지만 웹 API에 관한 내용은 아닙니다. 또한 JSON 형식에는 필드 이름이 포함됩니다. JavaScript 용으로 serialize 및 deserialize가 가능합니다. 그러나 문자열 값 "20"을 직렬화하면 문자열 또는 정수로 비 직렬화됩니다. Javascript에는 문제가되지 않지만 C#에는 문제가 될 수 있습니다. 어떻게하면 잘 작동하는지 정의하는 방법에주의하십시오. –

4

익명 형식을 사용할 수 없지만 WCF 및 형식이 지정되지 않은 메시지에 대해 이야기하고 있습니까?

Message 유형의 매개 변수 (및 가능한 동일한 유형의 반환 값)를 정의하기위한 옵션이 WCF에 있습니다. 이것은 WCF로가는 원시 메시지입니다 (그리고 다시 돌아옵니다).

거기에 좋은 정보를 찾을 수 없습니다. MSDN에는 몇 가지 문서가 있지만, 지금까지 본 내용 중 가장 좋은 것은 커트 클레이 위의 블로그 게시물 WCF : Untyped messages on WCF operations입니다.

이 방법을 사용하는 것을 권장하지 않습니다. 직접 메시지 내용을 직접 처리하는 것이 훨씬 더 힘들며 WCF가 우리를 구하려고 노력하고 있습니다.하지만 메시지의 모든 부분을 적극적으로 조정해야합니다. - 이것은 갈 길과 같습니다.

마크

+0

맞춤 메시지는 아마도이 메시지를 전달하는 방법 일 것입니다. +1 – Randolpho

1

OK, 나는 이해합니다. 그러나 유형을 MyObj로 정의하고 구성원의 IsRequired = false를 지정하면 은 멤버 중 일부만 사용하여 MyObj의 인스턴스를 통해 보낼 수 있습니까? 이것이 가능한가??

당신은 확실히 익명 형식을 반환 할 수 있습니다 [DataMember(EmitDefaultValue=false)]

0

를 살펴 보자. 이것은 예를 들어, 일 : 당신은 ASMX ScriptService의의 WebMethod 같은 메소드를 호출 할 경우

public object GetLatestPost() 
{ 
    XDocument feedXML = XDocument.Load("http://feeds.encosia.com/Encosia"); 

    var posts = from feed in feedXML.Descendants("item") 
        select new 
        { 
        Title = feed.Element("title").Value, 
        Link = feed.Element("link").Value, 
        Description = feed.Element("description").Value 
        }; 

    return posts.First(); 
} 

, 당신은 그것에서이 JSON을 얻을 것이다 :

{"d": 
    {"Title":"Using an iPhone with the Visual Studio development server", 
    "Link":"http://feeds.encosia.com/~r/Encosia/~3/vQoxmC6lOYk/", 
    "Description":" Developing iPhone-optimized portions of an ASP.NET ..."}} 

당신은 반환는 IEnumerable의 반환 형식을 사용할 수 있습니다 익명 형식의 컬렉션입니다.

+4

.NET 4 WCF에서 작동하지 않습니다. 그래도 해킹을 계속하려고합니다. – vlad259

+0

성공한 사람이 있습니까? 나는 응답 대신 504 오류를 계속 얻는다. – tishma

1

매개 변수없는 생성자에 대한 불만 때문에 XML 직렬 변환기에서 그렇게 할 수없는 것처럼 보이지만 Dave Ward가 지시 한대로 ajax 클라이언트에 서비스하는 경우 json serializer에서 작동합니다.

0

ExpandoObject를 사용할 수 있습니다. 당신은 DTO의 속성을 정의 할 때 ExpandoObject으로 클라이언트 사전으로 생성됩니다

계약 DTO

public class TaskDTO 
{ 
    public string Type { get; set; } 
    public ExpandoObject Args { get; set; } 
    public string Id { get; set; } 
    public TaskDTO SuccessTask { get; set; } 
    public TaskDTO FailTask { get; set; } 
    public bool IsFinal { get; set; } 
} 

클라이언트

using (var client = new JobServiceClient()) 
{ 
    var task = new TaskDTO 
    { 
     Id = Guid.NewGuid().ToString(), 
     Type = "SendEmailTask", 
     IsFinal = true 
    }; 
    dynamic args = new ExpandoObject(); 
    args.To = "[email protected]"; 
    args.Title = "test job service"; 
    args.Content = "test job service"; 
    task.Args = ((IDictionary<string, object>)args).ToDictionary(i => i.Key, i => i.Value); 
    client.Execute(task); 
} 

서비스

dynamic args = dto.Args;