在后期WCF服务消耗中获取错误请求

时间:2015-06-05 11:25:13

标签: c# jquery asp.net wcf

我正在使用jquery在asp.net中使用post wcf服务。我们可以通过用户登录和登录来调用该服务。登录时工作正常。下图显示了在fiddler中检查的帖子请求 enter image description here

当我在用户登录后调用相同的服务时,它给出了错误的请求,下面的图像显示用户登录后在fiddler中检查的帖子请求

enter image description here

在这个应用程序中,我使用了Identity Framework。

请给我一个解决这个问题的想法。

Jquery代码:

以下用于使用WCF服务的代码

 $("#btnSubmitReport").click(function () {

        // var count = document.getElementById().RatingBehavior._currentRating;
        var count = $("#<%=hdnRating.ClientID%>").val();


        if ($("input[id$='txtBannerCode']").val() == '') {
            alert('Banner Code is Required')
            $("input[id$='txtBannerCode']").focus();
        }
        else if ($('#<%= ddlIncidentType.ClientID %>').val() == "0") {
            alert('Please choose an option.')
            $('#<%= ddlIncidentType.ClientID %>').focus();
        }
        else if (count == "0") {
            alert('Driver Rating is Required.')
        }
        else if ($("textarea[id$='txtComment']").val() == '') {
            alert('Comment is Required')
            $("textarea[id$='txtComment']").focus();
        }

        else {

            ShowSendingProgress();
            var millisecondsToWait = 500;
            setTimeout(function() {

                if (checkCookie($("input[id$='txtBannerCode']").val() + $('#<%= ddlStates.ClientID %>').val()) == true) {
                    WCFJSONById();
                }
            }, millisecondsToWait);

}});

function WCFJSONById() {
    var count = $("#<%=hdnRating.ClientID%>").val();        
    var objIncident2 = {};
    objIncident2.StateAbbreviation = $('#<%= ddlStates.ClientID %>').val();
    objIncident2.BannerCode = $("input[id$='txtBannerCode']").val();
    objIncident2.IncidentTypeID = $('#<%= ddlIncidentType.ClientID %>').val();
    objIncident2.DrivingSkillID = count;
    objIncident2.Comment = $("textarea[id$='txtComment']").val();
    objIncident2.Latitude = "0";
    objIncident2.Longitude = "0";
    objIncident2.DeviceID = "";
    var browser = detectBrowser();
    objIncident2.DeviceUsed = browser.toString();

    var objIncident1 = {};
    objIncident1.objIncident = objIncident2;

    //      alert(JSON.stringify(objIncident1));



    Type = "POST";
    Url = "RoadLynkService.svc/SendIncidentReport";
    Data = JSON.stringify(objIncident1);
    ContentType = "application/json; charset=utf-8; charset-uf8;";
    DataType = "json"; ProcessData = true;
    CallService();

}



function CallService() {
    $.ajax({
        async: false,
        type: Type, //GET or POST or PUT or DELETE verb
        url: Url, // Location of the service
        data: Data, //Data sent to server
        contentType: ContentType, // content type sent to server
        dataType: DataType, //Expected data format from server
        processdata: ProcessData, //True or False
        success: function (msg) {//On Successfull service call
            ServiceSucceeded(msg);
        },
        error: ServiceFailed// When Service call fails
    });
}

Wcf服务代码

 public string SendIncidentReport(IncidentInputParameters objIncident)
    {
        return IncidentManager.InsertIncident(objIncident.StateAbbreviation, objIncident.BannerCode, objIncident.IncidentTypeID,
            objIncident.DrivingSkillID, objIncident.Comment, Convert.ToDecimal(objIncident.Latitude), Convert.ToDecimal(objIncident.Longitude), objIncident.DeviceID, objIncident.DeviceUsed);
    }

在插入事件方法中,我编写了用于插入数据库的代码。

事件输入参数类

 public class IncidentInputParameters
{

    public string StateAbbreviation { get; set; }


    public string BannerCode { get; set; }

    public string IncidentTypeID { get; set; }


    public string DrivingSkillID { get; set; }


    public string Comment { get; set; }


    public string Latitude { get; set; }


    public string Longitude { get; set; }


    public string DeviceID { get; set; }

    public string DeviceUsed { get; set; }
}

Web.config绑定

<system.serviceModel>
<behaviors>


  <endpointBehaviors>

    <behavior name="RESTEndpointBehavior">

      <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json"

               automaticFormatSelectionEnabled="true"/>
    </behavior>

  </endpointBehaviors>

  <serviceBehaviors>

    <behavior name="RESTServiceBehavior">

      <serviceMetadata httpGetEnabled="true" />

      <serviceDebug includeExceptionDetailInFaults="false"/>

    </behavior>

  </serviceBehaviors>

</behaviors>

<bindings>
  <webHttpBinding>
    <binding name="RESTBindingConfiguration" crossDomainScriptAccessEnabled="true">
      <security mode="None" />
    </binding>
  </webHttpBinding>
</bindings>

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
  <service behaviorConfiguration="RESTServiceBehavior" name="RoadLynkWeb.RoadLynkService">
    <endpoint address="" binding="webHttpBinding"   bindingConfiguration="RESTBindingConfiguration"
              behaviorConfiguration="RESTEndpointBehavior" contract="RoadLynkWeb.IRoadLynkService" />

    <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />

  </service>
</services>
<standardEndpoints>
  <webHttpEndpoint>

    <standardEndpoint crossDomainScriptAccessEnabled="true"></standardEndpoint>
  </webHttpEndpoint>
  <webScriptEndpoint>
    <standardEndpoint   crossDomainScriptAccessEnabled="true" />
  </webScriptEndpoint>
</standardEndpoints>

服务失败回复

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <title>Request Error</title>
   <style>BODY { color: #000000; background-color: white; font-family: Verdana; margin-left: 0px; margin-top: 0px; } #content { margin-left: 30px; font-size: .70em; padding-bottom: 2em; } A:link { color: #336699; font-weight: bold; text-decoration: underline; } A:visited { color: #6699cc; font-weight: bold; text-decoration: underline; } A:active { color: #336699; font-weight: bold; text-decoration: underline; } .heading1 { background-color: #003366; border-bottom: #336699 6px solid; color: #ffffff; font-family: Tahoma; font-size: 26px; font-weight: normal;margin: 0em 0em 10px -20px; padding-bottom: 8px; padding-left: 30px;padding-top: 16px;} pre { font-size:small; background-color: #e5e5cc; padding: 5px; font-family: Courier New; margin-top: 0px; border: 1px #f0f0e0 solid; white-space: pre-wrap; white-space: -pre-wrap; word-wrap: break-word; } table { border-collapse: collapse; border-spacing: 0px; font-family: Verdana;} table th { border-right: 2px white solid; border-bottom: 2px white solid; font-weight: bold; background-color: #cecf9c;} table td { border-right: 2px white solid; border-bottom: 2px white solid; background-color: #e5e5cc;}</style>
 </head>
 <body>
    <div id="content">
     <p class="heading1">Request Error</p>
     <p xmlns="">The server encountered an error processing the request. Please see the <a rel="help-page" href="http://localhost/RoadLynkWeb/RoadLynkService.svc/help">service help page</a> for constructing valid requests to the service. The exception message is 'Cross domain javascript callback is not supported in authenticated services.'. See server logs for more details. The exception stack trace is: </p>
  <p>   at System.ServiceModel.Dispatcher.JavascriptCallbackMessageInspector.AfterReceiveRequest(Message&amp; request, IClientChannel channel, InstanceContext instanceContext)
   at      System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.AfterReceiveRequestCore(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc&amp; rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)</p>
</div>

感谢,普尔纳

2 个答案:

答案 0 :(得分:1)

我找到了答案,我们需要指定crossDomainScriptAccessEnabled =“false”而不是true

谢谢,

普尔纳

答案 1 :(得分:0)

您必须传递IncidentInputParameters的对象。您已将objIncident2作为objIncident1的属性,这将使objIncident1成为一个类,objIncident2成为此类的属性。

所以这将被翻译成c#之类的东西IncidentInputParameters.Someproperty。您只需将objIncident2作为ajax调用中的数据传递

Data = JSON.stringify(objIncident2);