[c#] 웹 API 속성 라우팅의 선택적 매개 변수

다음 API 호출의 POST를 처리하고 싶습니다.

/v1/location/deviceid/appid

추가 매개 변수는 포스트 바디에서 제공됩니다.

이 모든 것이 잘 작동합니다. 이제 “deviceid”및 / 또는 “appid”및 / 또는 BodyData를 null로 허용하여 코드를 확장하려고합니다.

/v1/location/deviceid
/v1/location/appid
/v1/location/

이 3 개의 URL은 동일한 경로로 응답해야합니다.

내 첫 번째 접근 방식 (BodyData 필요) :

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody] location_fromuser BodyData)
{
    return repository.AddNewLocation(deviceid, appid, BodyData);
}

이것은 작동하지 않고 컴파일 오류를 반환합니다.

“선택적 매개 변수는 끝에 있어야합니다.”

다음 시도 :

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)

이제 내 함수 AddNewLocation ()은 항상 BodyData=null-호출이 Body를 보내더라도 가져옵니다 .

마지막으로 3 개의 매개 변수를 모두 선택 사항으로 설정합니다.

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)

작동하지 않음 :

선택적 매개 변수 BodyData는에서 지원되지 않습니다 FormatterParameterBinding.

선택적 매개 변수가있는 솔루션이 필요한 이유는 무엇입니까? 내 컨트롤러는 POST를 통해 “새 위치 추가”만 처리합니다.

잘못된 데이터를 내 자신의 예외 또는 오류 메시지로 보내고 싶습니다. 호출에 누락 된 값이 있더라도. 이 경우 예외를 던지거나 내 코드로 기본값 설정을 결정할 수 있기를 원합니다.



답변

들어오는 요청의 경우처럼 /v1/location/1234당신이에 대한 웹 API에 대한 어려울 것이다 상상할 수있는 세그먼트의 값이 ‘1234’에 해당하는 경우 자동으로 파악, 관련이 appid하지에 deviceid.

경로 템플릿을 변경 [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]한 다음 파싱하여 deiveOrAppidID 유형을 파악 해야한다고 생각합니다
.

또한 경로 템플릿 자체의 세그먼트를 선택 사항으로 만들어야합니다. 그렇지 않으면 세그먼트가 필수로 간주됩니다. ?이 경우 문자에 유의하십시오 . 예를 들면 :
[Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]


답변

또 다른 정보 : Route Constraint를 사용하려면 해당 매개 변수가 int 데이터 유형 을 갖도록 강제하려는 경우 다음 구문을 사용해야합니다.

[Route("v1/location/**{deviceOrAppid:int?}**", Name = "AddNewLocation")]

? 문자는 항상 마지막 } 문자 앞에 놓입니다.

자세한 내용은 선택적 URI 매개 변수 및 기본값을 참조하십시오.


답변

내 의견을 답변으로 변환하여 청중에게 도움이 될 것 같아 @Kiran Chala의 답변을 보완하기 위해-

?문자를 사용하여 조치 uri에서 매개 변수를 선택 사항으로 표시 할 때 아래와 같이 메소드 서명의 매개 변수에 기본값을 제공해야합니다.

MyMethod(string name = "someDefaultValue", int? Id = null)


답변