1

REST サービス searchFavoriteCompany を呼び出しています。このサービスは、別のサービス A を呼び出します。サービス A は既に JSON を返しています。しかし、戻り値の型が searchFavoriteCompany であるため、検索結果はエスケープ文字と共に返されます。

"{\"responseHeader\":{\"status\":0,\"QTime\":2,\"params\":{\"facet\":\"false\",\"fl\":\"id,title,friendlyurl,avatar,locpath,objectid,objecttype\",\"indent\":\"off\",\"start\":\"0\",\"q\":\"title_search:*castle*\",\"wt\":\"json\",\"fq\":\"userid:\\\"C325D42C-A777-4275-BDD2-D7810A8AB9AB\\\"\",\"rows\":\"10\",\"defType\":\"lucene\"}},\"response\":{\"numFound\":2,\"start\":0,\"docs\":[{\"title\":\"Castle A\",\"objecttype\":1,\"friendlyurl\":\"castle-a\",\"avatar\":\"6_887_castle-a.JPG\",\"objectid\":6},{\"title\":\"Castle B\",\"objecttype\":1,\"friendlyurl\":\"castle-b\",\"avatar\":\"794_360_13j-Castle-by-night.jpg\",\"objectid\":794}]}}\u000a"

JSON の結果がこれらのエスケープ文字なしで返されることを確認する方法がわかりません。

Imyservice.vb

Namespace RestService

<ServiceContract()>
Public Interface Imyservice

    <OperationContract()> _

_ Function searchFavoriteCompany(ByVal q As String, ByVal uuid As String) As String

End Interface

End Namespace   

iservice.svc.vb

Namespace RestService

Public Class iservice
    Implements Imyservice
    Public Function searchFavoriteCompany(ByVal q As String, ByVal uuid As String) As String Implements Imyservice.searchFavoriteCompany
        Dim req As HttpWebRequest = HttpWebRequest.Create("http://localhost/getjson")  <---- this service already returns JSON data
        Dim Resp As HttpWebResponse = req.GetResponse()
        Dim reader As StreamReader = New StreamReader(Resp.GetResponseStream)
        Dim responseString As String = reader.ReadToEnd()

        Return responseString

    End Function

End Class

End Namespace   

応答文字列を返す代わりに、私も試しました:

HttpContext.Current.Response.Write(responseString)
return ""

しかし、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが表示され、チェックしました:応答文字列に値が含まれているため、問題はありません。

4

1 に答える 1

0

出力を直接応答に渡すことができない場合、最善の策は、従来のメソッドに戻り、メソッドからタイプ セーフなオブジェクトを返すことです。元のサービスから渡された JSON を取得しました。最終的な目標は、その正確なオブジェクトを呼び出し元に返すことです。

例に完全な JSON オブジェクトがあると仮定すると、最初にjson2csharpに移動して JSON を取得し、そこからクラスを作成できます。C# を使用していますが、 Telerik の Code Converterなどを使用して簡単に VB に変換できます。

これらの手順に従うと、 と のRootObjectプロパティを含むと呼ばれるクラスや、必要なその他のクラスを含む、いくつかのクラスが作成されます。必要に応じてクラスの名前を変更し、適切な名前空間に配置できます。プロパティ名はそのままにして、JSON と一致させます。responseHeaderresponse

このRootObjectクラス (または名前を変更したもの) を取得したら、元のサービスから取得した JSON を型のオブジェクトに逆シリアル化できますRootObject。その後、WebAPI メソッドは単純に を返しますRootObject。他の WCF 呼び出しと同様に、フレームワークは、呼び出し元のためにそのオブジェクトを JSON (または XML) にシリアル化します。

于 2013-09-13T15:34:38.153 に答える