简体   繁体   中英

getting Bad Request in post WCF service consuming

I am consuming the post wcf service in asp.net using jquery. we can able to call the service with user login and with out login .It is worked fine with login . the following image shows the post request checked in fiddler 在此处输入图片说明

when i am calling same service after user login it is giving bad request the following image shows the post request checked in fiddler after user login

在此处输入图片说明

In this application i have used the Identity Framework.

Please give me an idea to solve this one.

Jquery code:

following code i have used for consuming the WCF service

 $("#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 Service Code

 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);
    }

In insert incident method I have written the code for inserting to database.

Incident input parameters Class

 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 bindings

<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>

Service failed response

<?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>

thanks,purna

I found the answer just we need to specify the crossDomainScriptAccessEnabled="false" instead of true

thanks ,

purna

You have to pass an object of IncidentInputParameters . You have made objIncident2 a property of objIncident1 which will make objIncident1 a class and objIncident2 a property of this class.

So this will be translated in c# something like this IncidentInputParameters.Someproperty . You simply have to pass objIncident2 as data in ajax call

Data = JSON.stringify(objIncident2);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM