2

.NET API を作成しましたが、それを使用しようとすると、奇妙な結果が得られます。

Chrome で API 呼び出しの URL にアクセスすると、期待どおりの結果が XML 形式で得られますが、IE で試してみるとファイルがダウンロードされ、それを開くと {} または [{} と表示されるだけです。 ,{},{},{}] 配列を返す呼び出しを試みた場合。

また、Webクライアントを使用してみました。

WebClient web = new WebClient();
var data = web.DownloadString("http://myAPI.example.com/api/MyAPI/APIMethod?parameter1=hiImAParameter");

これも空の {} を返します。

オンラインで検索してみましたが、この問題に関する言及はどこにもありません。どこかで何かが欠けているに違いないと確信していますが、API の設定方法を調べてみましたが、すべて問題ないようです。

編集:

これがChromeで得られる応答です。

<ArrayOfRoute xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/TimePointModel">
<Route>
    <RouteId>11235</RouteId>
    <RouteName>Fibonacci</RouteName>
    <Status i:nil="true"/>
    <Width>0</Width>
</Route>
</ArrayOfRoute>

Chrome の Accept ヘッダーにより、Chrome で XML を返します。IE では JSON を返すはずですが、何らかの理由で JSON が空になっています。

これは私のAPIコントローラーにあります:

[AcceptVerbs("GET")]
public IEnumerable<Route> APIMethod(double parameter)
{
    return new Manager(parameter).GetRoutes();
}

これは私の Global.asax.cs にあります。

void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.MapHttpRoute(
        name: "APIMethod",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { action = "APIMethod", id = System.Web.Http.RouteParameter.Optional }
    );
}

編集:

これは、パラメーターを必要としない API 呼び出しを行うときにうまく機能します。

WebClient web = new WebClient();
var data = web.DownloadString("http://myAPI.example.com/api/MyAPI/SimpleAPIMethod");

私は調査を行ってきましたが、次のようなパラメーターを追加してみました:

NameValueCollection myQueryStringCollection = new NameValueCollection();
string myParameter = "hiImAParameter";
myQueryStringCollection.Add("parameter1", myParameter);
web.QueryString = myQueryStringCollection;
var data = web.DownloadString("http://myAPI.example.com/api/MyAPI/APIMethod");

クエリ文字列を含む完全な URL を chrome に入力すると、配列内の空の {} の数が配列内の項目の数と一致することに気付きました。それは私のウェブクライアントのためにそれらを空にするだけです。

私も追加してみました

web.Headers[HttpRequestHeader.ContentType] = "application/json";

呼び出しを行う前ですが、結果にはまだ変化がありません。

そして、そのチュートリアルに従おうとしましたが、コンソール アプリケーション用に書かれており、HttpClient を使用しています。私は非同期呼び出しを行うことができないため、それを行うことはできません。これは Web サイトで使用されます。そのため、私は WebClient を使用しています。HttpWebRequest と HttpWebResponse で StreamReader を使用してみましたが、WebClient で発生したのと同じ問題がありました。

4

2 に答える 2

0

私は問題が何であるかを理解しました。[DataMember] 属性をリスト内のアイテムの属性に追加する必要がありました。その呼び出しの戻り値の型から除外されていることに気づきませんでした。

于 2014-11-05T21:06:00.940 に答える