【问题标题】:C# Restful Service Using WebInvoke POST使用 WebInvoke POST 的 C# Restful 服务
【发布时间】:2013-09-25 22:13:43
【问题描述】:

我正在用 C# 开发一个 Restful 服务并且在我使用时运行良好

[OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, BodyStyle =     
WebMessageBodyStyle.Wrapped, UriTemplate = "json/?id={id}")]
    string jdata(string id);

而我对应的函数实现是:

public string json(string id)
{
 return "You Typed : "+id;
}

到目前为止一切正常, 但是当我更改 WenInvoke Method="POST" 时,我必须面对“不允许的方法。”;

[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Xml, BodyStyle = 
WebMessageBodyStyle.Wrapped, UriTemplate = "json/?id={id}")]
    string jdata(string id);

【问题讨论】:

  • 您实际上是否向服务发送了 POST 请求?或者您是否尝试使用“仅网络浏览器中的 URL”来访问它? (WebBrowser URL = GET,网页表单 = POST)。 Get 只需要一个 URL Post 需要一个 URL + Body
  • 为什么不直接使用 MVC 4 Web API
  • @marvinSmit,请告诉我如何在 WEBINVOKE 中使用 Post 方法。谢谢
  • WebInvoke 属性将您的 Web 服务定义为“发布”。客户端需要确保它使用的是 POST 而不是 GET(即浏览基于 POST 的 RestFull 服务将产生一个不允许的方法)。如果您想使用浏览器进行测试,您必须制作一个“表单”,其中表单字段是参数,并且表单的操作设置为您的 Web 服务操作端点。

标签: web-services rest wcf-rest


【解决方案1】:

您收到“方法不允许”,因为您通过 GET 而不是 POST 到达 Uri“json/?id={id}”。 与您的客户核对这一点(您没有提到如何调用此资源)。请提供更多详细信息,您将如何尝试在客户端中使用您的 Web 服务。是.Net客户端吗?

为了测试您的 API,我建议使用 Fiddler - 当您可以在发送 http 请求之前明确指定是使用 GET 还是 POST 时:

另一件事是,您可能无意中将“json”用作 Uri,但将 ResponseFormat 定义为 WebMessageFormat.Xml。对客户来说是不是有点混乱?也许您想返回 JSON?在这种情况下,我建议在请求和响应中都使用 Json:

[WebInvoke(Method = "POST", UriTemplate = "/ValidateUser", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]

【讨论】:

    【解决方案2】:
     [OperationContract]
            [WebInvoke(Method="POST",
                ResponseFormat = WebMessageFormat.Json,
                BodyStyle = WebMessageBodyStyle.Bare,
                 UriTemplate = "json")]
            string jdata(string id);
    

    这是你的合同应该是什么样子,然后在客户端

    WebRequest httpWebRequest =
                 WebRequest.Create(
                   url);
                httpWebRequest.Method = "POST";
    string json = "{\"id\":\"1234"\}"
    
     using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                {
                    streamWriter.Write(json);
                }
                httpWebRequest.Timeout = 1000000;
    
                WebResponse webrespon = (WebResponse)httpWebRequest.GetResponse();
    
                StreamReader stream = new StreamReader(webrespon.GetResponseStream());
                string result = stream.ReadToEnd();
    
                 Console.Out.WriteLine(result);
    

    以上只是我用来测试我的服务的东西。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2016-02-18
      相关资源
      最近更新 更多