我正在开发基于WCF休息的服务。我在我的服务中编写了Get和Post方法,当我输入URL时,Get方法能够工作(获取数据)(JSON格式。
问题是当我尝试对POST方法执行相同操作时,该网址导航到其他页面“找不到页面...”。
我知道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天我正在与这个问题作斗争,我来到这里发布它。
任何帮助都非常感谢。
答案 0 :(得分:7)
经过多次试验和许多事情,我得到了有效的解决方案。在这里,我发布了我为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的旧设置,它正在工作。