91

Out of the box configuration works perfectly on my machine, no problems at all.

But when I deploy to our test environment - I get the following message

500 : { "Message": "An error has occurred." } /api/swagger/docs/v1

enter image description here The deployment is to default web site/api

Im guessing it has something to do with the baseUrl or something like that, but I have no idea of even where to begin.

My routes work fine within the project - I can call all my webapi endpoints and they respond correctly.

any help would be much appreciated

VisualBean
  • 4,908
  • 2
  • 28
  • 57

6 Answers6

185

When debugging I was using the debug config (Which I had generated XmlComments for: Properties -> build tab -> Output -> XML Documentation File)

I had not done this for my release configuration (duh...) - now everything works

VisualBean
  • 4,908
  • 2
  • 28
  • 57
  • I had the same problem. My deployment is on azure and I still have the issue. http://stackoverflow.com/questions/39406820/swagger-not-working-on-azure-web-app-running-as-owin – user2128702 Sep 09 '16 at 08:34
  • 2
    My deployment was on azure, but I forgot the simple thing. Change the project properties to create the XML file for release mode too! – Karl Gjertsen Jun 30 '17 at 20:50
  • What should the directory be? – Zapnologica Oct 10 '17 at 13:19
  • @Zapnologica it depends on where, you tell swagger config, the files are located. – VisualBean Jan 09 '18 at 08:35
  • It worked for me, but now the exact same error appears in ALL the Response Bodies of all the methods. "Message": "An error has occurred." Where should I look now? Thanks – Johannes Wentu Feb 20 '20 at 15:37
31

thank you @VisualBean.

As it was not so obvious for me .... how to... a simple image.

In Project > Your Project properties > Build Tab

enter image description here

stefmex
  • 584
  • 1
  • 6
  • 11
  • I can't believe how hard this was to debug since all I could get from Azure was the 500 error message. Your fix saved me hours! – Matt Oct 18 '22 at 22:05
16

Swashbuckle is hiding the real error message due to your customErrors setting in web.config. If you set customErrors to off you should get a better error message.

<system.web>
    <customErrors mode="Off"/>
</system.web>
fodonnel
  • 402
  • 4
  • 6
  • If the first answer does not work for you. Use this suggestion(turn on custom error mode) to see what is going on in your program. For me, I realized someone had introduced an ambiguous endpoint in one of our API Controllers. The moment I corrected this, we were all fine. – Seun S. Lawal Sep 22 '19 at 10:42
  • 1
    This is a better first step rather than guessing at what the error is! – LarryBud Apr 21 '21 at 14:14
3

As stated in the accepted answer you have to make sure the XML documentation file output is in bin and not bin\Debug or bin\Release (verify this for all build configurations).

I still got the 500 response because I use multiple XML documentation files. In my SwaggerConfig implementation I include XML documentation files from two projects (the WebApi project itself and a class library that is referenced by the WebApi project):

c.IncludeXmlComments(string.Format(@"{0}\bin\MyWebApiProject.xml", System.AppDomain.CurrentDomain.BaseDirectory));
c.IncludeXmlComments(string.Format(@"{0}\bin\ReferencedProject.xml", System.AppDomain.CurrentDomain.BaseDirectory));

The XML documentation file of the WebApi project was published correctly to the bin folder of the site, however the XML documentation file of the referenced project was not (even though it appears in the bin folder of the compiled project).

So you need to modify the WebApi project file (.csproj) in a text editor and add the following sections at the bottom (replace ReferencedProject):

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
  <CopyAllFilesToSingleFolderForMsdeployDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
  </CopyAllFilesToSingleFolderForMsdeployDependsOn>
</PropertyGroup>
<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\ReferencedProject\bin\ReferencedProject.xml" />
    <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>bin\%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

See How do you include additional files using VS2010 web deployment packages? for a full explanation.

Sven Vranckx
  • 374
  • 4
  • 5
  • As a variant on this, I added the custom markup to the pubxml file rather than csproj as described in the link below. Also used `Include=bin\*.xml` which included the xml from all referenced projects without needing to specify them explicitly. See https://learn.microsoft.com/en-us/aspnet/web-forms/overview/deployment/visual-studio-web-deployment/deploying-extra-files – Joe Jan 16 '18 at 11:05
0

The issue is that running dotnet publish with -r Release does not produce XML file. However, dotnet publish with -r Debug does in fact produce the file. This explains why people are only getting this issue when they are deploying to environments OTHER than locally, then kicking themselves when the find the exception only occurs on prod.(ITS THE RELEASE) In order to reporoduce, simply run those command locally and view output directory and you should see the issue.

(UPDATE) The fix for me was to actually go into .csproj file and add a line to ensure that the file was copied over always. Diff shown below enter image description here

Judy007
  • 5,484
  • 4
  • 46
  • 68
  • 1
    If you look at the accepted answer, you will probably see, just why this is. :) – VisualBean Jun 25 '17 at 19:34
  • @VisualBean if you are inferring that the solution is to modify the csproj file after changing using the properties window to update the Output > XML, I dont believe that solution is the solution for me, and I had the same issue. INstead, both my debug and release configuration are exactly the same, and dont have anythign specified in XML Documentation file, but still, the debug build will generate that file for debug, and not for release. – Judy007 Jun 25 '17 at 20:21
  • 1
    The accepted answer is to turn on XML comments in the release settings as well as the debug settings. – Karl Gjertsen Jun 30 '17 at 20:52
  • @KarlGjertsen, by "turning on XML" , what exactly do you mean? You mean actually place a value in the "XML Documentation Path"? Because this was not the fix for me, and I just want to know if you have concrete evidence that this is the fix, verses just saying "the fix is XYZ". The fix for me was to just ADD a document to source control, the one that is being derived, instead of depending on msbuild to do it fo rme – Judy007 Jun 30 '17 at 22:36
  • I mean checking the box in the project settings so the XML comment file is auto-generated. I had set this for the Dubuffet build, but not the release build. – Karl Gjertsen Jul 01 '17 at 19:21
  • Checking that box never worked for me. I had to update manually using the method I described above. Perhaps there are two separate issues, but this was mine and it smelled like the problem presented above – Judy007 Jul 17 '17 at 20:10
0

The accepted answer should be the first thing you try.

However, I have my XML output set to go to App_Data\ and have my Swashbuckle configured to read from that directory, so, it doesn't matter which way it gets built: the xml files are going to 'be there'. Nevertheless, I was still getting the error...

I found over at MSDN's forums @enough2012's answer:

select "Remove additional files at destination" in the "File Publish Options" within the "Settings" pane of the Publish dialog.

Worked like a charm!

bkwdesign
  • 1,953
  • 2
  • 28
  • 50