【问题标题】:How to make POST method in WCF Rest service working when data is passed in it?WCF Rest服务中的POST方法在传递数据时如何工作?
【发布时间】:2012-02-15 13:27:05
【问题描述】:

当我使用 GET 方法时,我有一个 wcf 休息服务,它工作正常(它们与 url 一起传递)。但是我需要使用 post 方法,并且当 post 方法中没有数据传递时,它可以正常工作。但是,当添加一些数据时,它会在 IE 中返回 Bad Request 错误,而在 mozila 和 chrome 中,它只会在 ajax jquery 请求中返回错误。我在这里重新发布了这个问题,因为我无法附加图像..在前面邮政。请帮忙…………

我已经在下面发布了我在 wcf 服务和 ajax 方法中使用的代码。请帮助....

Ischeduler.cs 中的代码

[ServiceContract]
public interface Ischeduler
{

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "GetData", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
    string GetData();

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "GetDataName", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
    string GetDataName(string Name);
}

scheduler.cs

public string GetData()
    {
        string getdata = "hello";
        return string.Format("You entered" + getdata);
    }
public string GetDataName(string Name)
    {
        return string.Format("You entered" + Name);
    }

按钮单击时 Schedular.aspx 中的 Ajax 请求

$("#btnInvoke").click(function () {
                  $.ajax({
                      type: "POST",
                      url: "http://localhost:3125/schedulerAPI_Service/scheduler.svc/GetDataName",
                      data: '{"Name": "John"}',
                      dataType: 'json',
                      contentType: "application/json; charset=utf-8",
                      crossdomain: true,
                      success: function (data) {
                         alert(data);
                      },
                      error: function (xhr, status, error) {
                          alert("failed " + error);
                      }
                  });

Wcf 网络配置

<?xml version="1.0"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0"/>
        <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/></system.web>
    <connectionStrings>
        <add name="InstaScribeCentralConnectionString" connectionString="Data Source=ATLT53;Initial Catalog=InstaScribeCentral;User ID=sa;Password=bmjobmjo;" providerName="System.Data.SqlClient"/>
    </connectionStrings>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ServiceBehavior">
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
            <endpointBehaviors>
                <behavior name="ServiceBehavior">
                    <webHttp/>
                </behavior>
            </endpointBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="ServiceBehavior" name="scheduler">
                <endpoint address="" behaviorConfiguration="ServiceBehavior" binding="webHttpBinding" contract="Ischeduler"/>
            </service>
        </services>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    </system.serviceModel>
</configuration>

【问题讨论】:

    标签: jquery wcf post


    【解决方案1】:

    首先尝试在您的 WCF 服务上启用Tracing

    我在您的配置中注意到了几件事:

    1. 服务元素的名称属性值应该是完全限定的名称。

    2. endpoint 元素具有应为完全限定名称的合同属性值。

    例如:

    SampleWCF.Scheduler (i.e. namespace.ServiceName)
    

    请参阅我的示例,以 json 格式将数据发布到 WCF 服务:

    我的 WCF 服务方法:

    [WebInvoke]
    public string GetParam(string Name)
    {
        return Name + " from server";
    }
    

    现在从 Fiddler 发布一些数据:

    当您要传递字符串时,您用于发布数据的格式不正确。

    【讨论】:

    • 请参阅我的更新答案,了解当您的 REST WCF 服务方法中有字符串参数时如何发布数据
    • 是的,谢谢你的回答,问题在于我在请求中传递的数据
    【解决方案2】:

    你有没有像下面那样做,即向服务类添加属性

       [AspNetCompatibilityRequirements(RequirementsMode 
            = AspNetCompatibilityRequirementsMode.Allowed)]
        public class Service : IService
        {
            // Your code comes here
        }
    

    查看这篇有助于您完成任务的文章:Calling WCF Services using jQuery

    编辑

    查看此帖子也可以帮助您完成任务:Create REST service with WCF and Consume using jQuery

    【讨论】:

    • @deepu - 如果可能的话,请按照文章,下载代码并检查您的错误
    • 我正在使用休息服务,该服务将是一个localhost:3125/schedulerAPI_Service/scheduler.svc/GetDataName链接
    • 问题是在 ajax 请求中传递的数据字符串,data: '{"Name": "John"}' 返回错误然后我创建了一个对象和 JSON.stringify(obj) 并通过了 post方法有效....我真的对这个错误感到困惑,因为到目前为止我从未遇到过这样的错误..感谢 Pranay Rana 的宝贵答案
    【解决方案3】:

    在您的服务上添加异常处理以准确查看异常是什么。这样,您不仅可以解决这个异常,而且可以在未来优雅地处理其他异常。

    如果您尚未创建配置行,请在 Application_Start 下的 Global.asax 文件中添加:

    //where config is your WebApiConfiguration/HttpConfiguration file
    
    config.ErrorHandlers = (Handlers, endpoints, descriptions) =>
                {
                    Handlers.Add(new CustomErrorHandler(descriptions));
                };
    

    然后创建添加到类上面的异常处理程序:

    public class CustomErrorHandler : HttpErrorHandler
    {
        public IEnumerable<HttpOperationDescription> Descriptions { get; set; }
    
        public CustomErrorHandler(IEnumerable<HttpOperationDescription> descriptions)
        {
            Descriptions = descriptions;
        }
    
        protected override bool OnTryProvideResponse(Exception exception, ref System.Net.Http.HttpResponseMessage message)
        {
            //use exception variable to see what the exception is and then you can either decide
            //to output a response to the user and do nothing further at which point you return true and set the message variable,        or you can just leave it false to return as is.
    
            return false;
        }
    }
    

    另外,你现在使用什么版本作为 WCF Rest 被称为 WCF Web api,据我所知它是 0.6,你可以通过 NuGet 获得?

    【讨论】:

      猜你喜欢
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      相关资源
      最近更新 更多