1

私はWeb APIの初心者です。カスタムの名前付きアクションを使用して Web Api コントローラーを作成します。HttpClient を使用して WPF クライアントからこれを呼び出しています。しかし、エラー 応答ステータス コードが成功を示していません 404 (Not Found) が表示されます。

これが私のWeb APIコントローラーです:

public class ActivationController : ApiController
{
    private readonly IActivationUnit _activationUnit;

    public ActivationController()
    {
        _activationUnit = new ActivationUnit();
    }

    //  api/activation/GetAllActivisionInformations
    public HttpResponseMessage GetAllActivationInformations(string username)
    {
        return Request.CreateResponse(HttpStatusCode.OK, _activationUnit.ActivationRepository.GetActivationInformations(username));
    }

    // api/activation/NewLicense
    [HttpPost]
    public HttpResponseMessage PostNewLicense(LicenseMetadata licenseMetadata)
    {
        bool isSuccess = _activationUnit.ActivationRepository.NewLicense(licenseMetadata.Username, licenseMetadata.ActivisionInformation);
        if (isSuccess)
        {
            try
            {
                _activationUnit.Save();
            }
            catch (Exception)
            {
                isSuccess = false;
            }
        }
        return Request.CreateResponse(isSuccess ? HttpStatusCode.OK : HttpStatusCode.BadRequest, isSuccess);
    }
}

私のルーティングは:

 //   Route for POST method
 config.Routes.MapHttpRoute(
 name: "DefaultApi2",
 routeTemplate: "api/{controller}/{action}/{id}",
 defaults: new { id = RouteParameter.Optional }
 );

 //   Route  GET method

 config.Routes.MapHttpRoute(
 name: "DefaultApi1",
 routeTemplate: "api/{controller}/{action}/{id}",
 defaults: new { action = "get", id = RouteParameter.Optional }
 );

私のクライアントコードは:

 HttpClient client = new HttpClient();
 client.BaseAddress = new Uri("http://localhost:42471");
 client.DefaultRequestHeaders.Accept.Add(
       new MediaTypeWithQualityHeaderValue("application/json"));

 var licenseMetadata = new LicenseMetadata
      {
         ActivisionInformation = new ActivisionInformation(),
         Username = "UserName"
       };

 var response = await client.PostAsJsonAsync("api/activation/NewLicense", licenseMetadata);
 try
   {
      response.EnsureSuccessStatusCode();
      MessageBox.Show("Success");

    }
    catch (Exception ex)
    {
       MessageBox.Show(ex.Message);
    }

HttpClient を使用してサーバーに要求を送信すると、応答ステータス コードが成功を示していない 404 (見つかりません)

URL「api/activation/newlicense」を「api/activation/PostNewLicense」に変更しようとしましたが、この場合は取得します

応答ステータス コードが成功を示していない 500 (Internal Server Error)フォーム HttpClient

私が間違っているところ。私はすでに2日を費やしています。

使用しています: Visual Studio 2012、.NET 4、MVC 4、Windows 8、IIS 8

4

3 に答える 3

6

アクション名に Get/Post を含むデフォルトの実装を使用せず、代わりにメソッドを呼び出したい場合は、ルートを調整します (最初のものだけで、get 用の 2 番目のものはありません)。 )、および接頭辞の使用を停止します。GetPost

ルート構成:

config.Routes.MapHttpRoute(
    name: "DefaultActionNameApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
};

コントローラーで:

public class ActivationController : ApiController
{
    // .. other code ..

    // api/Activation/NewLicense
    [HttpPost]
    public HttpResponseMessage NewLicense(LicenseMetadata licenseMetadata)
    {
        // .. rest of your code ..
    }
}

個人的には、REST API を作成しようとしている場合を除き、デフォルトの実装は好きではありません。GetFooBarそれが機能する方法は、 andを持つことができるということです。 and のPostBarBaz後に何があるかは問題ではありません。私の目的のために、私は常に上記のようにルートをオーバーライドします。GetPost

于 2013-08-27T06:15:15.543 に答える
1

これは実際には素晴らしい質問です。まだ誰も答えていません。これが答えです。このように期待される Route で Post メソッドを装飾する必要があります。

これは、私が最終的に仕事に就いた私の例です。私の投稿方法:

    [HttpPost]
    [Route("api/excel/createauditfile")]
    public IHttpActionResult CreateAuditFile(Request<AuditFile> request)
    {
        Response<FileInfo> response = new Response<FileInfo>();

        try
        {
            response.Result = _repository.CreateAuditFile(request.Parameter);
            response.IsSuccessStatusCode = true;
        }
        catch (Exception ex)
        {
            response.IsSuccessStatusCode = false;
            response.exception = ex;
        }
        return Ok<Response<FileInfo>>(response);
    }

私のサービスコール方法:

    public FileInfo CreateAuditFile(AuditFile auditFile)
    {
        Request<AuditFile> request = new Request<AuditFile>();
        request.Parameter = auditFile;

        response = Client.PostAsJsonAsync("api/excel/createauditfile", request).Result;

        if (response.IsSuccessStatusCode)
        {
            var data = response.Content.ReadAsStringAsync().Result;
            var responseData = JsonConvert.DeserializeObject<Response<FileInfo>>(data);

            if (!responseData.IsSuccessStatusCode)
            {
                Exception ex = responseData.exception;
                throw ex;
            }

            return responseData.Result;
        }
        else
        {
            throw new Exception("An unexpected Service Exception has Happened.  Please contact your administrator.");
        }
    }
于 2016-08-03T19:47:18.010 に答える
0

デフォルト ルートは、アクション メソッドに対して機能するはずです。Web API は、http 動詞に基づいて適切なアクション メソッドを選択します。

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);

コントローラーは、get 要求を送信して取得できるリソースを表し、それに post 要求を発行して作成します。

投稿するときは、次の URL を使用する必要があります。

var response = await client.PostAsJsonAsync("api/activation", licenseMetadata);

多くの場合、500 応答は、API メソッドが呼び出されて例外がスローされたことを意味します。これを確認するために、Web API メソッドの最初の行にブレークポイントを設定します。また、リクエストとレスポンスをよりよく確認するために、フィドラーを入手することをお勧めします。

于 2013-08-27T05:14:02.580 に答える