問題保護的WCF 4.0 REST服務:如何發送PUT請求發送到使用OAuth 2.0和DotNetOpenAuth
是否有任何手段(也許是一個解決方法),以支持PUT和DELETE與HTTP動詞使用OAuth 2.0和DotNetOpenAuth 4保護的WCF 4.0 REST服務?我沒有使用WCF Web API或WCF入門套件。
我迄今所做的:
考慮以下WCF 4.0 REST服務:
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class MyService
{
[WebGet(UriTemplate = "")]
public List<Resource> GetCollection()
{
/* some implementation */
}
[WebInvoke(UriTemplate = "", Method = "POST")]
public Resource Create(Resource instance)
{
/* some implementation */
}
[WebGet(UriTemplate = "{id}")]
public Resource Get(string id)
{
/* some implementation */
}
[WebInvoke(UriTemplate = "{id}", Method = "PUT")]
public Resource Update(string id, Resource instance)
{
/* some implementation */
}
[WebInvoke(UriTemplate = "{id}", Method = "DELETE")]
public void Delete(string id)
{
/* some implementation */
}
}
的OAuth 2.0用於控制對服務的訪問。它通過使用DotNetOpenAuth的自定義ServiceAuthorizationManager實現來完成所有工作。該實現與DotNetOpenAuth 4.0示例提供的實現幾乎完全相同。
對於POST和GET請求它很好。然而,請求失敗的PUT和DELETE與錯誤信息的請求:
'AccessProtectedResourceRequest' messages cannot be received with HTTP verb 'PutRequest'
客戶端代碼看起來類似於:
public class ResourceClient
{
public Resource UpdateResource(Resource resource)
{
var uri = new Uri(new Uri("http://api.example.com/"), Resource.Format("resources/{0}", resource.Id));
var serializer = new DataContractSerializer(typeof(Resource));
var request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "PUT";
request.ContentType = "application/xml";
ClientBase.AuthorizeRequest(request, Authorization.AccessToken);
using (var requestStream = request.GetRequestStream())
{
serializer.WriteObject(requestStream, resource);
}
using (var response = (HttpWebResponse)request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
Debug.Assert(responseStream != null, "responseStream != null");
return (Resource)serializer.ReadObject(responseStream);
}
}
}
}
從another question答案似乎這是可能DotNetOpenAuth中的一個缺陷。查看OAuth 2.0規範,我沒有看到禁止在訪問資源時使用PUT或DELETE http動詞的任何內容。也就是說,我不是OAuth 2.0的專家,也不是我的心。
所以我認爲我會「聰明」,並使用「X-HTTP-Method-Override」指定PUT,然後將請求發佈到資源服務器。我按照this sample中的解釋執行了該行爲。有趣的是,自定義行爲在我的ServiceAuthorizationManager實現之前被調用,導致了完全相同的錯誤。
另一種方法是解決DotNetOpenAuth本身的問題,但我不知道從哪裏開始。
我用盡了想法,我會很感激任何建議。
下一個發佈計劃何時計劃? – bloudraak 2012-02-24 07:00:23
您可以在這裏查看各種功能發佈計劃的最佳預測日期:https://github.com/AArnott/dotnetopenid/issues/milestones – 2012-02-24 14:11:11