ServiceStack: Handler for request not found?

南笙酒味 提交于 2020-01-24 16:17:38

问题


I have three routes defined. First two work fine but the last one returns error in the subject.

    Routes.Add<FeeInstructionsList>("/policies/{clientPolicyId}/feeinstructions", "GET");
    Routes.Add<FeeInstructionsEdit>("/policies/{clientPolicyId}/feeinstructions/{feetype}", "GET");
    Routes.Add<List<FeeInstructionEditInfo>>("/policies{clientPolicyId}/feeinstructions", "POST");

When I had third route as just "/feeinstructions", it worked fine, but when I added route as above it does not work.

FeeInstructionEditInfo does not have memeber called "clientPolicyId". Could that be a reason. If so, how do I pass it to service without requiring to modify my dto. Can it be additional parameter on the service operation like this. I don't this it is possible as ss is one dto per request, but maybe there is a way?

public List<FeeInstructionEditInfo> Post(int clientPolicyId, List<FeeInstructionEditInfo> request)

Currently this method is declared as

public List<FeeInstructionEditInfo> Post(List<FeeInstructionEditInfo> request)

This is the request being sent

> POST http://localhost:12543/api/policies/680455600/feeinstructions/
> HTTP/1.1 Content-Type: application/json Accept-Language: en-US
> Referer: http://localhost:12543/ClientBin/SR.SRUnite.ShellUI.xap
> Content-Length: 1408 Accept-Encoding: identity Accept:
> application/json User-Agent: Mozilla/5.0 (compatible; MSIE 9.0;
> Windows NT 6.1; WOW64; Trident/5.0; BOIE9;ENUS) Host: localhost:12543
> Connection: Keep-Alive Pragma: no-cache

These are my original dtos, and these have not changed

 [Route("/policies/{clientPolicyId}/feeinstructions/{feetype}","GET")]
 public class FeeInstructionsEdit
 {
     public int ClientPolicyId { get; set; }
     public string FeeType { get; set; }
 }

 public class FeeInstructionsEditResponse
 { 
     public List<KeyValuePair> Instructions { get; set; }
     public List<KeyValuePair> Contacts { get; set; }
     public List<FeeInstructionEditInfo> FeeInstructions { get; set; }       
 }

public partial class FeeInstructionEditInfo
{
    public int FeeInstructionId { get; set; }

    public string FeeTypeCode { get; set; }
    public string FeeTypeDescription { get; set; }
    public string FeeTypeGroupCode { get; set; }

    public string ProductName { get; set; }
    public string InsuredType { get; set; }
    public string Demographic { get; set; }
    public string Instruction { get; set; }
    public string Contact { get; set; }
    public decimal? FeeAmount { get; set; }
}

I would post list of FeeInstructionEditInfo to /clientPolicies/342434/feeinstructions and it would not work, but posting to /feeinstructions would.

I now post using this pair of dto's.

 [Route("feeinstructions","POST")]
 public class FeeInstructionsSave
 {
     public int ClientPolicyId { get; set; }
     public List<FeeInstructionEditInfo> FeeInstructions { get; set; }
 }

 public class FeeInstructionsSaveResponse : IHasResponseStatus
 {
      public ResponseStatus ResponseStatus { get; set; }
 }

回答1:


A fundamental concept in ServiceStack is that every service needs to be called with a Request DTO. This Request DTO can be populated with any combination of PathInfo, QueryString and Request Body.

This means if you wanted to pass in a collection you would need to have your Request DTO inherit from it, e.g:

[Route("/policies/{clientPolicyId}/feeinstructions", "POST")]
public class EditFeeInstructions : List<FeeInstructionEditInfo>
{
}

Now everything behaves as normal:

public List<FeeInstructionEditInfo> Post(EditFeeInstructions request)
{
   ...
}

For an Empty Request your service would look like:

public class EmptyRequest {} 

public object Post(EmptyRequest request)
{
   ...
}

Even if you want to process the request manually yourself, you would still need to provide a Request DTO signalling your intent, e.g:

public class Hello : IRequiresRequestStream
{
    //The raw Http Request Input Stream gets injected here
    public Stream RequestStream { get; set; }
}


来源:https://stackoverflow.com/questions/15882178/servicestack-handler-for-request-not-found

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!