【问题标题】:How to pass parameter(s) to a WCF post method (a restful services)如何将参数传递给 WCF 发布方法(宁静的服务)
【发布时间】:2014-09-14 05:10:09
【问题描述】:

我正在开发基于 WCF 休息的服务。我在我的服务中编写了 Get 和 Post 方法,当我输入 URL(JSON 格式)时,Get 方法能够工作(获取数据)。

问题是当我尝试对 POST 方法执行相同操作时,该 url 正在导航到其他页面“未找到页面...”。

我了解 POST 方法需要提交表单来处理请求。

因此,我尝试了 chrome 扩展(Simple Rest 客户端、Advanced Rest 客户端、Post man rest 客户端)和 Fiddler。

这里我发布我的服务方法——Get方法(接口方法声明)。

[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, 
ResponseFormat =   WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, 
UriTemplate = "GetCategoryTypes/")]
List<CategoryType> GetCategoryTypes();

这是我的 POST 方法

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "AddOrders/", 
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
int AddOrders(decimal amount, int tableID, DateTime orderDate, int isActive);

这是我的服务的 web.config 文件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
   </system.web>  
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="ServiceBehaviour" allowCookies="true" messageEncoding="Mtom" />
      </basicHttpBinding>
      <webHttpBinding>
        <binding name="ServiceBehaviour1" allowCookies="true"/>
      </webHttpBinding>
    </bindings>
    <services>
      <service name="EMC.DD.ServiceLayer.Service1" ehaviorConfiguration="ServiceBehaviour">
        <endpoint address="http://localhost/EMCService/Service1.svc" 
           binding="basicHttpBinding" contract="EMC.DD.ServiceLayer.IService1">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>      
      </service>
      <service name="EMC.DD.ServiceLayer.Service2" 
         behaviorConfiguration="ServiceBehaviour1">
        <endpoint address="http://localhost/EMCService/Service2.svc" 
          binding="webHttpBinding" behaviorConfiguration ="web" 
          contract="EMC.DD.ServiceLayer.IService2">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>     
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name ="ServiceBehaviour">     
          <serviceMetadata httpGetEnabled="true" />      
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
        <behavior name ="ServiceBehaviour1">       
          <serviceMetadata httpGetEnabled="true" />        
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name ="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors> 
  </system.serviceModel>
 <system.webServer>
        <directoryBrowse enabled="true" />
  </system.webServer>
</configuration>

我不确定我的方法构造(POST 方法)是否有任何错误,或者我需要测试它的方式。

我需要你们所有专家的帮助,过去 2 天我一直在努力解决这个问题,最后我来到这里发布它。

非常感谢任何帮助。

【问题讨论】:

  • 您只是希望能够测试您的方法?当您使用 fiddler 执行上述帖子时它不会触发?
  • 我确实想知道我构造的方法是否正确。以及如何测试发布方法(检查方法是否正确实施)。 @paqogomez
  • 您是否看到请求通过 fiddler 传递?你看到服务器返回的状态码了吗?

标签: c# json wcf rest http-post


【解决方案1】:

最后经过多次试验和许多事情,我得到了可行的解决方案。在这里,我发布了我为 POST 方法工作所做的工作。

  [OperationContract]
  [WebInvoke(Method = "POST", UriTemplate = "AddOrders", RequestFormat =   
  WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,BodyStyle = 
  MessageBodyStyle.Bare)]
  int AddOrders(RequestData orderRequestData);

这是为了在运营合同中实现的。

客户端应用程序:-

        WebClient WC = new WebClient();
        WC.Headers.Add("Content-Type", "application/json");
        WC.Encoding = Encoding.UTF8;

        MemoryStream MS = new MemoryStream();
        DataContractJsonSerializer JSrz = new 
        DataContractJsonSerializer(typeof(RequestData));
        JSrz.WriteObject(MS, order);
        string data = Encoding.UTF8.GetString(MS.ToArray(), 0, (int)MS.Length);

        byte[] res1 = 
        WC.UploadData("http://localhost/EMCService/Service2.svc/AddOrders", "POST",MS.ToArray());

        MS = new MemoryStream(res1);
        JSrz = new DataContractJsonSerializer(typeof(int));
        int result = (int)JSrz.ReadObject(MS);

我没有进行任何配置设置,仍然使用我在上述问题中发布的 web.config 的旧设置,它正在工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2012-07-03
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多