【问题标题】:Error posting JSON to WCF Rest Service将 JSON 发布到 WCF Rest 服务时出错
【发布时间】:2012-08-25 00:27:08
【问题描述】:

我有一个 WCF Rest 服务,我正在尝试使用 Firefox Rest 客户端进行测试,

我调用的方法的签名是

        [WebInvoke(Method = "POST", UriTemplate = "UploadEvidenceData/{userName}/{password}/{cdb}")]
    public EvidenceData UploadEvidenceData(string userName, string password, string cdb, EvidenceData evidence)

证据的数据合同是

    [DataContract(Name = "EvidenceData", Namespace = "http://StudentEvidence.com")]
public class EvidenceData
{
    [DataMember]
    public string LearnerID { get; set; }

    [DataMember]
    public string UnitID { get; set; }

    [DataMember]
    public string AssessorID { get; set; }

    [DataMember]
    public int MethodO { get; set; }  //int

    [DataMember]
    public int MethodEwt { get; set; }  //int

    [DataMember]
    public int MethodEp { get; set; }  //int

    [DataMember]
    public int MethodQc { get; set; }  //int

    [DataMember]
    public int MethodEps { get; set; }  //int

    [DataMember]
    public int MethodPd { get; set; }  //int

    [DataMember]
    public int MethodS { get; set; }  //int

    [DataMember]
    public int MethodEwa { get; set; }  //int

    [DataMember]
    public int MethodEch { get; set; }  //int

    [DataMember]
    public int MethodEwe { get; set; }  //int

    [DataMember]
    public int MethodApel { get; set; }  //int

    [DataMember]
    public int EvidenceID { get; set; }  //int

    [DataMember]
    public string EvidenceFileName { get; set; }

    [DataMember]
    public int EvidenceFileSize { get; set; }  //int

    [DataMember]
    public string EvidenceDescription { get; set; }

    [DataMember]
    public string AssessorFeedback { get; set; }

    [DataMember]
    public string Signature { get; set; }

    [DataMember]
    public int RequirementID { get; set; }  //int

    [DataMember]
    public int ModuleID { get; set; }  //int

    public EvidenceData()
    {
        this.LearnerID = string.Empty;
        this.UnitID = string.Empty;
        this.AssessorID = string.Empty;
        this.MethodO = 0;
        this.MethodEwt = 0;
        this.MethodEp = 0;
        this.MethodQc = 0;
        this.MethodEps = 0;
        this.MethodPd = 0;
        this.MethodS = 0;
        this.MethodEwa = 0;
        this.MethodEch = 0;
        this.MethodEwe = 0;
        this.MethodApel = 0;
        this.EvidenceID = 0;
        this.EvidenceFileName = string.Empty;
        this.EvidenceFileSize = 0;
        this.EvidenceDescription = string.Empty;
        this.AssessorFeedback = string.Empty;
        this.Signature = null;
        this.RequirementID = 0;
        this.ModuleID = 0;
    }
}

当我使用客户端时,使用地址http://something.com/Service/UploadEvidence/user/pass/mydb

我把身体放进去

{"AssessorFeedback":"Nothing to report","AssessorID":"32fac8c2-0f9b-4cad-a2e4-55b06e968da0","EvidenceDescription":"some evidence","EvidenceFileName":"Lighthouse.jpg","EvidenceFileSize":561276,"EvidenceID":0,"LearnerID":"61b9eca6-6c3e-4bd3-8963-69d9ad3e5eeb","MethodApel":0,"MethodEch":0,"MethodEp":0,"MethodEps":0,"MethodEwa":0,"MethodEwe":0,"MethodEwt":0,"MethodO":0,"MethodPd":0,"MethodQc":0,"MethodS":0,"ModuleID":1131,"RequirementID":30476,"Signature":null,"UnitID":"c33ea6e1-ac54-46dc-a512-3a2efafd5a0b"}

我有应用程序/json 的自定义标头

这一切都可以在 .net 客户端上正常工作,但不是每次都来自 firefox 400 的其余客户端插件。

非常感谢任何帮助

不要

我的网络配置文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <httpRuntime maxRequestLength="2147483647"/>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
    </compilation>
  </system.web>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </modules>
  </system.webServer>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name=""
                          helpEnabled="true"
                          automaticFormatSelectionEnabled="true"
                          defaultOutgoingResponseFormat="Json"
                          maxReceivedMessageSize="2147483647"
                          maxBufferSize="2147483647"
                          transferMode="Buffered" />

      </webHttpEndpoint>
    </standardEndpoints>
    <services></services>
  </system.serviceModel>
</configuration>

【问题讨论】:

  • 唐 - 刚刚修剪了你的签名:stackoverflow.com/faq#signatures
  • @JcFx 一句简单的“谢谢”并没有什么坏处,而且实际上很有礼貌。建议的修改应该是解决帖子中多个问题的实质性改进。
  • @JcFx 虽然您提供的链接也是有效的,但请看这里:meta.stackexchange.com/questions/139830/… 无论如何,非常感谢您对本网站的承诺。
  • @tombom 我自己的“提前致谢”以及姓名已从我的第一篇帖子 (stackoverflow.com/posts/11214301/revisions) 中删除。从那以后,我看到从其他帖子中删除了任何数量的感谢 + 姓名签名。我知道我们根本不会在帖子上签名。我个人认为允许签名会提高网站的文明程度,谢谢,只要他们不自我推销,但最重要的是认为任何规则都应该始终如一地应用。在这种情况下,我很乐意向您提供更丰富的经验。
  • @JcFx 嗯,有两个反对删除“谢谢”的论据:1. 它会导致其他审查编辑的人不必要的工作 2. 在这个网站上搜索“谢谢”,你会发现成千上万的问题/answers,所以有时这样的编辑只是声誉耕作。我当然不会把这归咎于你。

标签: c# wcf rest


【解决方案1】:

400 通常意味着错误的 Http 方法。 Firefox 客户端是否使用 GET(这需要您的方法具有不同的属性,并调整您的 web.config 以允许 Web 获取),还是您确定它是 POST?

另外,请检查此内容类型问题:Why does my C# client, POSTing to my WCF REST service, return (400) Bad Request?

还要查看将RequestFormat = WebMessageFormat.Json 添加到装饰您的服务方法的[WebInvoke] 属性是否有帮助。我认为这默认为 xml,这可能是 .NET 客户端发送的内容。 http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute.requestformat.aspx

【讨论】:

  • 感谢回复,链接,我已经在使用application/json了。我使用 POST 是因为它们的复杂类型在请求正文中作为 JSON 传递,这就是为什么它没有出现在 UriTemplate 中的原因?因此,如果我是正确的,GET 将无法工作,这就是我不使用 GET 的原因。
  • 没错,您不应该使用 get(它不适用于该配置)。我只是想知道Firefox客户端是否默认使用GET?此外,您可能会发布您的 Web.Config - 我认为问题更可能出在服务配置中而不是实现中。另外 - 检查是否启用了跨域访问:我不确定 Firefox 测试客户端似乎是从哪个“域”调用的,但这是过去给我 400 错误的另一件事。
  • 在上面发布了 web 配置,Firefox 客户端默认是 GET 但我已更改为 POST。
  • 我看不出那里出了什么问题,但希望其他人能够利用这些信息。
  • 最后一个想法。您可以尝试将 RequestFormat = WebMessageFormat.Json 添加到您的 WebInvoke 属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多