Преобразование HttpListener для запуска в IIS - PullRequest
4 голосов
/ 21 ноября 2011

Я слышал, что есть способы взять приложение на C #, которое использует HttpListener, и изменить его так, чтобы оно работало в IIS, но я не могу найти какие-либо конкретные ссылки на это. У кого-нибудь есть идеи по этой теме, которыми они могли бы поделиться?

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

Я нашел то, что искал здесь: http://support.microsoft.com/kb/308001

Похоже, что есть только незначительные изменения кода, которые должны быть реализованы. Надеюсь, что это может помочь кому-то еще.

Редактировать 6/21/19

@ Паразиты спросили, могу ли я найти ссылку, которую я не смог, но я нашел действительно старую кодовую базу с некоторым смущающим кодом, который может, по крайней мере, обеспечить некоторые отправные точки / направления ( надеюсь и для других тоже). Пожалуйста, прости меня, если я не проясняю «почему» за некоторыми из этих предметов (это было некоторое время назад, и я не понимал всего этого до глубины, которую я должен был иметь).

1) Сервисный договор

[ServiceContract] public interface <svcName> ... 
{
        [OperationContract]
        [WebGet(UriTemplate = "/*", BodyStyle = WebMessageBodyStyle.Bare)]
        Stream MyGetMethod();

        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "/*", BodyStyle = WebMessageBodyStyle.Bare)]
        Stream MyPostMethod(Stream bodyStream);

2) Я также должен был предоставить картограф содержимого (я не могу вспомнить почему)

    public class RawContentTypeMapper : WebContentTypeMapper
    {
        public override WebContentFormat GetMessageFormatForContentType(string contentType)
        {
            return WebContentFormat.Raw;
        }
    }

3) Затем мне нужно было кое-что сделать в web.config ...

  <system.serviceModel>
    <services>
      <service name="<namespace>.<svcName>" behaviorConfiguration="<behaviorName>">
        <endpoint address="" binding="customBinding" behaviorConfiguration="<behaviorName>" contract="<namespace>.<svcName>" bindingConfiguration="<customBinding>"/>
      </service>
    </services>
    <bindings>
      <customBinding>
        <binding name="<customBinding>">
          <!-- Used for REST.  See http://www.codehosting.net/blog/BlogEngine/post/WebContentFormatRaw-in-your-WCF-config-file.aspx -->
          <!-- Provide the fully qualified name of the WebContentTypeMapper, set max message size to 500MB  -->
          <webMessageEncoding webContentTypeMapperType="<namespace>.RawContentTypeMapper, <namespace>, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          <httpTransport manualAddressing="true" maxReceivedMessageSize="524288000" transferMode="Buffered" />
        </binding>
      </customBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="<behaviorName>">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="<behaviorName>">
          <webHttp helpEnabled="true"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <diagnostics performanceCounters="All"/>
  </system.serviceModel>

Я также видел эту ссылку в комментариях к проекту, которая может оказаться полезной: http://www.codehosting.net/blog/BlogEngine/post/WebContentFormatRaw-in-your-WCF-config-file

Вам придется простить меня, если я не смогу действительно объяснить «почему» всего вышеперечисленного. Некоторые из них просты для понимания (отображение методов GET, POST), некоторые из них мне показалось, что я просто что-то пробовал (материал web.config).

В некотором контексте я вспоминаю, что приложение, которое я переносил, имело код для работы со всеми базовыми HTTP-соединениями и тому подобным, и после того, как я перенес его в IIS с использованием вышеизложенного, это было не то, что оно было очень хрупким Мне казалось, что я потерял много контроля, фактически не понимая, как и почему, и необходимость вносить изменения действительно заставляла меня чувствовать, что это хрупко. Это одна из причин, по которой я создал Watson Webserver (бесстыдный плагин) для быстрой сборки серверов RESTful: https://www.nuget.org/packages/Watson/2.0.5

1 голос
/ 21 ноября 2011

Это скомпилировано как исполняемый файл, который вы можете запустить из командной строки? Если так:

В проектах Azure есть хук, который вы можете использовать для запуска сторонних приложений, которые должны запускаться в фоновом режиме. Я предлагаю вам создать рабочую роль, добавить конечную точку, чтобы открыть необходимый порт в Azure. Добавьте существующий исполняемый файл в качестве элемента в проект (настроив его на локальное копирование) и запустите его с фоновой задачей в файле определения сервиса.

Стив Маркс имеет хороший пост в блоге о том, как это сделать здесь: http://blog.smarx.com/posts/using-other-web-servers-on-windows-azure

...