Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# jQuery Ajax——当URL包含编码的#&x27;s_C#_Wcf_Web Services_Rest - Fatal编程技术网

C# jQuery Ajax——当URL包含编码的#&x27;s

C# jQuery Ajax——当URL包含编码的#&x27;s,c#,wcf,web-services,rest,C#,Wcf,Web Services,Rest,我有一个RESTful WCF服务,我正在使用jQuery.ajax()执行PUT to操作。我的一个操作使用5个字符串作为参数。此操作对RDF文档执行任务,因此其中一些参数在字符串中包含(#)。为了适应这种情况,我对这些参数进行了编码 我的问题是,当url包含这些编码参数时,请求将以404失败。出于测试目的,我省略了#,请求正常执行。我不明白为什么编码的#(%23)会导致404。有人能帮我理解出了什么问题吗 行动: [OperationContract] [CorsBehavi

我有一个RESTful WCF服务,我正在使用jQuery.ajax()执行PUT to操作。我的一个操作使用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:

作品:


我将把我的评论变成回答的形式

即使您看到的是URL编码,翻译后的URL如下所示:

http://localhost:1605/Service.svc/Graphs/myLib/123abc/content#HasA/456def#ghik/en-us
因此,您的“页面”实际上是
123abc/content
,这就是为什么它是404

要解决此问题,请在WCF服务方法中使用参数和DTO(域对象或类)作为参数。它可以是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再次检查以确保情况属实。我是根据之前的经验和您给我们的信息猜测的。

正如另一个答案所指出的,下面的两个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

我无法评论这会导致问题的原因,但我的解决方案是使用JSON或基于POST的参数,而不是所有基于URL的参数来绕过任何类似的问题。这样你就可以确信,无论通过了什么,它都会被正确地通过。有可能吗?编辑:实际上,原因是浏览器认为您正在访问
123abc/content#hash
。我打赌,如果你在Fiddler中检查了你的请求,你会发现这就是原因。我会看看Fiddler是否按照你的建议显示解码的哈希。谢谢你的意见。。我会试一试。实际上,Fiddler显示了带有编码%23的url。。我将尝试实现一个DTO,就像您在示例中所做的那样。您说如果名称匹配,WCF将把JSON对象的键/值映射到dto??再次感谢DTO的使用似乎让我绕过了这个问题。无论如何,我更喜欢将参数包装到类型化对象中。非常感谢。这是一个很好的解释,我不太明白我自己,考虑到如此显示。