2009-07-15 5 views
4

Ich versuche, einen OpenSearch-Vorschlagsdienst zu schreiben, der der OpenSearch-Spezifikation entspricht.Serialisierung von Array mit Objekten zu JSON in WCF zur Einhaltung von OpenSearch

http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions

Diese spec erfordert den Dienst eine JSON Array mit dem ersten Element zurückzubringen Arrays von Strings eine Zeichenfolge und die folgenden Elemente sein wird. Ich bin in der Lage, es fast dorthin zu bringen, indem ich ein Array von Strings (string [] []) zurückschicke und WCF dies in JSON serialisieren lasse. Um der Spezifikation zu entsprechen, habe ich jedoch versucht, ein Array von Objekten (object []) zurückzugeben, wobei das erste ein String ist und der Rest Arrays aus Strings (string []) sind.

Jedes Mal, wenn ich versuche, das Array von Objekten zurück, funktioniert es nicht, wie diese:

Von Service:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class SuggestionService : ISuggestionService 
{ 
    public object[] Search(string searchTerms) 
    { 
     SearchSuggestions = new object[4]; 
     SearchText = searchTerms; 
     SearchSuggestions[0] = SearchText; 
     Text = new string[10]; 
     Urls = new string[10]; 
     Descriptions = new string[10]; 

     // Removed irrelevant ADO.NET code 
     while (searchResultReader.Read() && index < 10) 
     { 

      Text[index] = searchResultReader["Company"].ToString(); 
      Descriptions[index] = searchResultReader["Company"].ToString(); 
      Urls[index] = "http://dev.localhost/Customers/EditCustomer.aspx?id=" + 
          searchResultReader["idCustomer"]; 
      index++; 
     } 

     SearchSuggestions[1] = Text; 
     SearchSuggestions[2] = Descriptions; 
     SearchSuggestions[3] = Urls; 
     return SearchSuggestions; 
    } 

    [DataMember] 
    public string SearchText { get; set; } 

    [DataMember] 
    public string[] Text { get; set; } 

    [DataMember] 
    public string[] Descriptions { get; set; } 

    [DataMember] 
    public string[] Urls { get; set; } 

    [DataMember] 
    public object[] SearchSuggestions { get; set; } 
} 

Hier ist die gesamte Oberfläche:

[ServiceContract] 
public interface ISuggestionService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "/Search?q={searchTerms}", 
     BodyStyle = WebMessageBodyStyle.Bare, 
     ResponseFormat = WebMessageFormat.Json)] 
    object[] Search(string searchTerms); 
} 

Das verursacht, den Dienst zurückzugeben "Error 324 (net :: ERR_EMPTY_RESPONSE): unbekannter Fehler." Dies ist der einzige Fehler, den ich bekommen konnte.

Kann ich nicht ein Array von Objekten verwenden, um eine Zeichenfolge und drei Arrays zu speichern? Was kann ich noch tun, um WCF zu verwenden, um den richtigen JSON zurückzugeben, der dieser Spezifikation entspricht?

EDIT: Hinzugefügt viel mehr des Codes

Antwort

5

Sie hat einen Haufen [Datamember] s. Bitte posten Sie den gesamten [DataContract]. Zeigen Sie uns auch das JSON, das zurückgegeben wird, wenn Sie das DataContract zurückgeben.


Ein Datenvertrag sollte niemals Verhalten enthalten. Versuchen Sie, die folgenden (ich habe keine Chance hatte, es zu testen, und müssen zu fälschen Sie die Daten tun):

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class SuggestionService : ISuggestionService 
{ 
    public SearchResults Search(string searchTerms) 
    { 
     var results = new SearchResults 
          { 
           SearchText = searchTerms, 
           Text = new string[10], 
           Urls = new string[10], 
           Descriptions = new string[10] 
          }; 

     // Removed irrelevant ADO.NET code 
     int index = 0; 
     while (searchResultReader.Read() && index < 10) 
     { 

      results.Text[index] = searchResultReader["Company"].ToString(); 
      results.Descriptions[index] = searchResultReader["Company"].ToString(); 
      results.Urls[index] = "http://dev.localhost/Customers/EditCustomer.aspx?id=" + 
          searchResultReader["idCustomer"]; 
      index++; 
     } 

     return results; 
    } 
} 

[DataContract] 
public class SearchResults 
{ 
    [DataMember] 
    public string SearchText { get; set; } 

    [DataMember] 
    public string[] Text { get; set; } 

    [DataMember] 
    public string[] Descriptions { get; set; } 

    [DataMember] 
    public string[] Urls { get; set; } 
} 

Ok, ich lese genug von dieser Spezifikation und der JSON Spezifizierung, um mich davon zu überzeugen, dass Sie wirklich ein Array von Objekten zurückgeben müssen, und nicht eine Instanz einer Klasse, die ein Array von Objekten enthält. Das hat natürlich nicht funktioniert. Hier ist, was Sie benötigt:

[ServiceContract] 
[ServiceKnownType(typeof(string))] 
[ServiceKnownType(typeof(string[]))] 
public interface ISuggestionService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "/Search?q={searchTerms}", 
     BodyStyle = WebMessageBodyStyle.Bare, 
     ResponseFormat = WebMessageFormat.Json)] 
    object[] Search(string searchTerms); 
} 

Ich habe es gerade versucht, und es hat funktioniert. Hier ist die JSON (Vertiefung hinzugefügt):

[ 
    "abc", 
    ["Company1","Company2","Company3",...], 
    ["Company1 Description","Company2 Description","Company3 Description",...], 
    ["http:\/\/dev.localhost\/Customers\/EditCustomer.aspx?id=1", 
    "http:\/\/dev.localhost\/Customers\/EditCustomer.aspx?id=2", 
    "http:\/\/dev.localhost\/Customers\/EditCustomer.aspx?id=3",...] 
] 
+0

Danke für die Antwort, ich habe den gesamten relevanten Code hinzugefügt. –

+0

Dies ist, was ich ursprünglich versuchte, das Problem ist, dass es die Namen der Objekte in der JSON zurückgibt, die außerhalb der Spezifikation ist. Es muss so etwas zurückgeben (Aus Referenz): ["sea", ["sears", "suchmaschinen", "search engine", "search", "sears.com", "seattle mal"], ["7.390.000 Ergebnisse", "17.900.000 Ergebnisse", "25.700.000 Ergebnisse", "1.220.000.000 Ergebnisse", "1 Ergebnis", "17.600.000 Ergebnisse"], ["http://example.com?q=sears", "http: //beispiel.de?q = search + engines ", http://example.com?q=search+engine", http://example.com?q=search "," http://example.com?q=sears. com "," http://example.com?q=seattle+times "]] –

+0

Ich kann ein gezacktes Array von Strings (string [] []) zurückgeben und es ist fast da, das Problem ist, dass das erste Element des JSON-Array ist umgeben von Klammern, was außerhalb der Spezifikation liegt, weshalb ich versucht habe, ein Array von Objekten (Objekt []) zurückzugeben. " –

Verwandte Themen