我有一个RESTful WCF服务,我正在使用jQuery执行PUT.ajax()我的一个操作需要5个字符串作为参数。此操作在RDF文档上执行任务,因此其中一些参数包括字符串中的(#)。为了适应这个,我正在编码这些参数。
我的问题是当url包含这些编码参数时,请求失败并带有404.出于测试目的,我省略了#并且请求正常执行。我不明白为什么编码#(%23)导致404.有人能帮我理解什么是错的吗?
操作:
[OperationContract]
[CorsBehavior]
[WebInvoke(Method = "PUT", UriTemplate = "Graphs/{library}/{subjectLocalPart}/{predicateLocalPart}/{objectPart}/{languageCode}")]
ResultMessage CreateTriple(string library, string subjectLocalPart, string predicateLocalPart, string objectPart, string languageCode);
404:
http://localhost:1605/Service.svc/Graphs/myLib/123abc/content%23HasA/456def%23ghik/en-us
使用:
http://localhost:1605/Service.svc/Graphs/myLib/123abc/contentHasA/456defghik/en-us
答案 0 :(得分:1)
正如另一个答案所指出的,下面的两个URL基本相同
http://localhost:1605/Service.svc/Graphs/myLib/123abc/content%23HasA/456def%23ghik/en-us
http://localhost:1605/Service.svc/Graphs/myLib/123abc/content#HasA/456def#ghik/en-us
如果你想在URI中发送'#',你需要转义转义版本,这样当它在服务器上没有转义时,它就是你所期望的:
http://localhost:1605/Service.svc/Graphs/myLib/123abc/content%2523HasA/456def%2523ghik/en-us
答案 1 :(得分:0)
我会将我的评论写成答案。
即使它显示为URL编码,翻译的URL如下:
http://localhost:1605/Service.svc/Graphs/myLib/123abc/content#HasA/456def#ghik/en-us
因此,您的“页面”实际上是123abc/content
,这就是为什么它是404。
要解决此问题,请使用参数和DTO(域对象或类)作为WCF服务方法中的参数。它可以是JSON或name=value
对;我个人使用JSON。
[OperationContract]
[CorsBehavior]
[WebInvoke(Method = "PUT", UriTemplate = "Graphs/{library}/triple")]
ResultMessage CreateTriple(string library, TripleModel model);
[DataContract]
public class TripleModel {
[DataMember]
public string SubjectLocalPart { get; set; }
[DataMember]
public string PredicateLocalPart { get; set; }
[DataMember]
public string ObjectPart { get; set; }
[DataMember]
public string LanguageCode { get; set; }
}
我没有100%对此进行过测试,但只是使用Fiddler仔细检查以确保是这种情况。我猜是基于先前的经验和你给我们的东西。