HttpPatch를 사용하여 개체를 부분적으로 업데이트하고 있습니다. 이 작업을 수행하기 위해 OData의 Delta 및 Patch 메서드를 사용하고 있습니다 (여기에 언급 : Web API로 부분 업데이트를 수행하는 현재 권장되는 방법은 무엇입니까? ). 모든 것이 잘 작동하는 것 같지만 매퍼가 대소 문자를 구분한다는 것을 알았습니다. 다음 개체가 전달되면 속성이 업데이트 된 값을 가져옵니다.
{
"Title" : "New title goes here",
"ShortDescription" : "New text goes here"
}
그러나 소문자 또는 낙타 케이스 속성을 사용하여 동일한 개체를 전달하면 Patch가 작동하지 않습니다. 새 값이 통과하지 않으므로 역 직렬화 및 속성 매핑에 문제가있는 것 같습니다. 즉, "shortDescription"에서 "ShortDescription"으로 ".
패치를 사용하여 대소 문자 구분을 무시하는 구성 섹션이 있습니까?
참고 :
출력에서 다음 포맷터를 사용하는 카멜 케이스 속성 (REST 모범 사례에 따라)이 있습니다.
//formatting
JsonSerializerSettings jss = new JsonSerializerSettings();
jss.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.SerializerSettings = jss;
//sample output
{
"title" : "First",
"shortDescription" : "First post!"
}
그러나 내 모델 클래스는 다음과 같은 C # /. NET 형식 지정 규칙입니다.
public class Entry {
public string Title { get; set;}
public string ShortDescription { get; set;}
//rest of the code omitted
}
짧은 대답, 아니요 (내가 아는 한) 대소 문자 구분을 취소하는 구성 옵션이 없습니다.
긴 대답 : 저는 오늘 당신과 같은 문제를 겪었고 이것이 제가 그 문제를 해결 한 방법입니다.
대소 문자를 구분해야한다는 사실이 엄청나게 짜증이 났고, 그래서 우리가 남용하는 거대한 라이브러리이기 때문에 전체 oData 부분을 없애기로 결정했습니다 ....
이 구현의 예는 내 github github 에서 찾을 수 있습니다.
나는 실제로 우리가 부족한 근육이기 때문에 나만의 패치 방법을 구현하기로 결정했습니다. 다음 추상 클래스를 만들었습니다.
public abstract class MyModel
{
public void Patch(Object u)
{
var props = from p in this.GetType().GetProperties()
let attr = p.GetCustomAttribute(typeof(NotPatchableAttribute))
where attr == null
select p;
foreach (var prop in props)
{
var val = prop.GetValue(this, null);
if (val != null)
prop.SetValue(u, val);
}
}
}
그런 다음 모든 모델 클래스를 * MyModel *에서 상속합니다. * let *을 사용하는 줄을 적어 둡니다. 나중에 제외하겠습니다. 이제 컨트롤러 작업에서 Delta를 제거하고 put 메소드와 마찬가지로 다시 Entry로 만들 수 있습니다. 예 :
public IHttpActionResult PatchUser(int id, Entry newEntry)
다음과 같은 방식으로 패치 방법을 계속 사용할 수 있습니다.
var entry = dbContext.Entries.SingleOrDefault(p => p.ID == id);
newEntry.Patch(entry);
dbContext.SaveChanges();
자, 다시 라인으로 돌아 가자
let attr = p.GetCustomAttribute(typeof(NotPatchableAttribute))
패치 요청으로 모든 속성을 업데이트 할 수있는 보안 위험을 발견했습니다. 예를 들어, 이제 패치를 통해 ID를 변경할 수 있도록 할 수 있습니다. 내 속성을 장식 할 사용자 지정 속성을 만들었습니다. NotPatchable 속성 :
public class NotPatchableAttribute : Attribute {}
다른 속성과 마찬가지로 사용할 수 있습니다.
public class User : MyModel
{
[NotPatchable]
public int ID { get; set; }
[NotPatchable]
public bool Deleted { get; set; }
public string FirstName { get; set; }
}
이 호출에서 Deleted 및 ID 속성은 patch 메서드를 통해 변경할 수 없습니다.
이 문제가 해결되기를 바랍니다. 질문이 있으시면 주저하지 말고 의견을 남겨주세요.
새 mvc 5 프로젝트에서 소품을 검사하는 스크린 샷을 추가했습니다. 보시다시피 결과보기는 제목 및 간단한 설명으로 채워집니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다