0

I am using fiddler to test my web service. It connects to a SQL server database (that is connected and running) The get works on local host and through IIS Express in VS 2017. On IIS, the server works except for the GET request through fiddler. Please let me know if you need to see my Service1.svc file (To much code not enough text error) I have tried all other answers

Fiddler Example

Fiddler Example

web.config

<appSettings>
  <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
  <compilation debug="true" targetFramework="4.6.1" />
  <httpRuntime targetFramework="4.6.1"/>
</system.web>
<system.serviceModel>

      <!--<behavior>
         To avoid disclosing metadata information, set the values below to false before deployment
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
         To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information
        <serviceDebug includeExceptionDetailInFaults="false"/>
      </behavior> -->
  <bindings>
    <webHttpBinding>
      <binding name="restLargeBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed">
        <readerQuotas maxStringContentLength="2147483647"/>
      </binding>
    </webHttpBinding>
  </bindings>
  <behaviors>
    <endpointBehaviors>
      <behavior name="myWebEndPointBehaviour">
        <webHttp automaticFormatSelectionEnabled="true" defaultBodyStyle="Bare" defaultOutgoingResponseFormat="Json" helpEnabled="true"/>
        <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      </behavior>
    </endpointBehaviors> 

    <serviceBehaviors>
      <behavior name="myServiceBehaviour">
        <serviceMetadata httpGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
        <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>

  <services>
    <service name="TestWcfService.Service1" behaviorConfiguration="myServiceBehaviour">
      <endpoint address="" contract="TestWcfService.IService1" binding="webHttpBinding" bindingConfiguration="restLargeBinding" behaviorConfiguration="myWebEndPointBehaviour"></endpoint>
      <endpoint address="mex" contract="TestWcfService.IService1" binding="mexHttpBinding" />
    </service>
  </services>

  <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https" />
  </protocolMapping>    
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"/>
  <!--
      To browse web app root directory during debugging, set the value below to true.
      Set to false before deployment to avoid disclosing web app folder information.
    -->
  <directoryBrowse enabled="true"/>
</system.webServer>

IService1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace TestWcfService
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IService1
    {

        // TODO: Add your service opperations here

        // Get Method
        [OperationContract]
        [WebGet(UriTemplate = "GetUserName")]
        List<UserName> GetUserName();

        // Post Method
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "AddUser", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        int AddUser(string user);

    }

    [DataContract]
    public class UserName
    {
        string user;

        [DataMember]
        public string User
        {
            get { return user; }
            set { user = value; }
        }
    }
}
inDepth
  • 121
  • 1
  • 13
  • Can you debug the wcf service? – Chetan Nov 22 '18 at 04:09
  • I could, but I do not get an error in visual studio, only on fiddler – inDepth Nov 22 '18 at 04:11
  • 1
    I would suggest to write proper exception handling in your code and write the error and exception detail in some log file. So that you can know what exact error you are getting. The Fiddler screen capture you share does not say anything about the error message. So not sure what could be the issue. I assume there that the Visual Studio, IIS and the fiddler all are on the same machine. – Chetan Nov 22 '18 at 04:18
  • Do you have tested it in the browser(postman) and return the result correctly? which authentication you used for connecting the SQL server? try to use SQL Server Authentication. – Abraham Qian Nov 22 '18 at 06:57
  • I found the exception, it was `Login failed for user 'IIS APPPOOL\WCFService` And a search lead me to the accepted answer to this question which solved the problem, https://stackoverflow.com/questions/7698286/login-failed-for-user-iis-apppool-asp-net-v4-0 Accept I added the login for `IIS APPPOOL\WCFService` instead of `asp-net` on the answer. – inDepth Nov 22 '18 at 07:36

1 Answers1

1

I needed to find the proper exception message. There are a couple different ways to do it, but the easiest in this case was to use fiddler (because the error was caused while using it). All I needed to do was paste the Uri I was using for the GET request and paste it in the browser. This gave me the exception and the trace details. I then used the exception message Login failed for user 'IIS APPPOOL\WCFService to search for an answer. The accepted answer on this question Login failed for user 'IIS APPPOOL\ASP.NET v4.0' is the solution (the login may or not slightly differ depending on exact error code and service that you are using)

Hope this helps someone else out there.

inDepth
  • 121
  • 1
  • 13
  • Yes, thank you for sharing the progress. I start to think it is the authentication problem of database connection. If you try to specify the connection string using SQL server authentication, I don't think there will be such problem. – Abraham Qian Nov 23 '18 at 02:11