3

私のAndroidアプリは、私のAndroidアプリからデータを更新して送信するためのWebApiコードを書いたサーバーにいくつかのデータを更新する必要があります。ローカルサーバーでテストしているときは両方とも正常に動作しますが、グローバルにアップロードした後は動作せず、次のようなエラーが発生します:(Androidアプリとフィドラーの両方でテスト済み)

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE
Content-Type: text/html
Server: Microsoft-IIS/8.0

Android と C# の両方で単純なコードを使用しました。

Android コード:

            HttpClient client  = new DefaultHttpClient();
            HttpPut post = new HttpPut(PUT_SETTINGS_DATA);
            try {
                JSONStringer vm = new JSONStringer().object().key("UserId")
                        .value(UserId).key("IsGPSOn").value(String.valueOf(isServiceOn)).endObject();
                post.setHeader("Accept", "application/json");
                post.setHeader("Content-type", "application/json");

                StringEntity entity = new StringEntity(vm.toString());
                post.setEntity(entity);
                HttpResponse response = client.execute(post);
                BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                String vv = "";
                while((vv = br.readLine()) != null){
                    Log.v("Response Count", vv+" "+UserId);
                }

            } catch (JSONException e1) {
                e1.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

WebApi コード:

    [HttpPut]
    public int Put(SettingsVM vm)
    {
        using (var db = new ApiDBContext())
        {

            string sqlQry = "Select COUNT(ID) FROM Settings WHERE UserId= '" + vm.UserId + "'";
            var count = db.Database.SqlQuery<Int32>(sqlQry).SingleOrDefault();
            if (count != 0)
            {
                string sql = "Update Settings Set IsGPSOn={1} where UserId={0}";
                count = db.Database.ExecuteSqlCommand(sql, new object[] { vm.UserId, vm.IsGPSOn });
                db.SaveChanges();
            }
            else
            {
                string sql = "INSERT INTO Settings(UserId,IsGPSOn) VALUES({0},{1})";
                count = db.Database.ExecuteSqlCommand(sql, new object[] { vm.UserId, vm.IsGPSOn });
                db.SaveChanges();
            }
            return count;

        }

    }

このエラーを解決するために、考えられるすべての解決策を既に確認してテストしていますが、同じ問題に直面しています。

ありがとう

4

4 に答える 4

0

Web サーバーからの応答を見ると、許可されている動詞がリストされています。PUT はその 1 つではありません。

web.config を編集して、アプリケーションの PUT を有効にします。

これがローカルで機能した理由は、IIS Express と Cassini が動詞の制限を強制していないためだと思います。

ここで構成例までスクロールします: http://www.iis.net/configreference/system.webserver/security/requestfiltering/verbs

于 2014-06-28T07:58:55.820 に答える
0

あなたのリクエストを見なくても、 http://www.fluff.com/api/Fluff?id=MyID のような ID を送信して、http://www.fluff.com/api/ように送信してください。代わりに綿毛/MyID

ここで私の以前の回答を参照してください: https://stackoverflow.com/a/25577497/1176452

于 2015-11-13T12:34:50.340 に答える