C # - Первая попытка с WCF в VS2008 - PullRequest
4 голосов
/ 26 ноября 2009

Я пишу свой первый SVC и что-то упустил. Все отлично компилируется, но страница, похоже, ничего не возвращает из моего сервиса.

Сервисный код:

namespace RivWorks.Web.Services
{
    [ServiceContract(Namespace = "http://www.rivworks.com/ws/")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class PlayerService
    {
        [OperationContract]
        public string Decrypt(string interactive)
        {
            return RivWorks.Security.Cryptography.Internal.Decrypt(interactive);
        }

        [OperationContract]
        public void LogEvent(Int64 HistoryRequestID, string VideoPath, string Action, string Target, string ClientDateTime, string UrlReferrer, float Offset, string TimeZone)
        {
            DateTimeOffset dt = RivWorks.DateTimeInfo.ConvertFromFlash(ClientDateTime);
            RivWorks.Membership.UserInfo userInfo = RivWorks.DateTimeInfo.GetUserInfo(dt, Offset, TimeZone, "Log Request");
            RivWorks.Data.Player.LogEvent(HistoryRequestID, VideoPath, Action, Target, userInfo, UrlReferrer);
        }
    }
}

Мой код ASPX:

<body>
    <form id="form1" runat="server">
        <h1>Greeting</h1>
        <div>
            <asp:Literal id="PutFrameHere" runat="server" />
        </div>
        <hr />
        <asp:ScriptManager ID="SM1" runat="server">
            <Services>
                <asp:ServiceReference Path="~/Services/PlayerService.svc" />
            </Services>
        </asp:ScriptManager>
        <script type="text/javascript">
            function OnDecrypt(result) {
                www.rivworks.com.ws.PlayerService.Decrypt($get("encryptedText").value, OnDecryptComplete, OnError, null);
            }
            function OnDecryptComplete(result) {
                alert("Complete:  " + result.toString());
            }
            function OnError(result) {
                alert("Error:  " + result.toString());
            }
        </script>
        Enter encrypted string:<input type="text" id="encryptedText" />
        <br />
        <input type="button" value="Decrypt" onclick="OnDecrypt()"? />
    </form>
</body>

Когда я нажимаю кнопку, кажется, ничего не происходит. Я ожидал ошибку или строку в ответ. Использование FireBug и ServiceCapture ничего не раскрывает. ServiceCapture не показывает поступающие запросы.

На несколько другой заметке - что мне нужно сделать, чтобы приложение Flash и / или Flex правильно вызывало службу? Я не делаю ни того, ни другого, поэтому мне любопытно, как должна выглядеть команда (чтобы дать нашим разработчикам flash / flex пример для работы.)

Какие-нибудь советы, подсказки, хитрости?


Забыл сказать, что я использовал учебник на http://www.pluralsight.com/community/blogs/fritz/archive/2008/01/31/50121.aspx


Из моего web.config:

 <system.serviceModel>
  <behaviors>
   <endpointBehaviors>
    <behavior name="RivWorks.Web.Services.PlayerServiceAspNetAjaxBehavior">
     <enableWebScript />
    </behavior>
   </endpointBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  <services>
   <service name="RivWorks.Web.Services.PlayerService">
    <endpoint address="" behaviorConfiguration="RivWorks.Web.Services.PlayerServiceAspNetAjaxBehavior"
     binding="webHttpBinding" contract="RivWorks.Web.Services.PlayerService" />
   </service>
  </services>
 </system.serviceModel>
</configuration>

Простите, я не совсем понимаю, что вы искали. Я также пропустил разделы, которые не изменились при добавлении WCF.


<%@ ServiceHost Language="C#" 
                Debug="true" 
                Service="RivWorks.Web.Services.PlayerService" 
                CodeBehind="PlayerService.svc.cs" %>

Не совсем соответствует ...

1 Ответ

1 голос
/ 26 ноября 2009

Можете ли вы показать нам свой сервис конфигурации? Какую привязку вы используете? basicHttp или webHttp (REST)?

По умолчанию, если вы используете службу SOAP в WCF, когда вы переходите к URL-адресу файла * .svc, вы не получаете много - страница, сообщающая, что служба была найдена, - вот и все. Это по замыслу.

Вы можете включить метаданные в сервисах SOAP (на основе WSDL / XSD) - но вам нужно явно сделать это - по умолчанию не происходит.

ОБНОВЛЕНИЕ: под "настройкой службы" Я имею в виду все, что находится в вашем файле web.config, который находится внутри раздела <system.serviceModel> - это раздел WCF.

Вы используете webHttpBinding для веб-службы REST - я думаю, вам нужно добавить поведение "webHttp" в поведение вашей службы. Я не очень знаком с REST и Ajax, так что это немного неисследованная территория для меня ...

  <behaviors>
   <endpointBehaviors>
    <behavior name="RivWorks.Web.Services.PlayerServiceAspNetAjaxBehavior">
     <webHttp />
     <enableWebScript />
    </behavior>
   </endpointBehaviors>
   <serviceBehaviors>
    <behavior name="AjaxRestServiceBehavior">
     <webHttp />
    </behavior>
   </serviceBehaviors>
  </behaviors>

Можете ли вы попытаться добавить <webHttp /> в ваш web.config, а затем сослаться на него из декларации сервиса:

<service name="RivWorks.Web.Services.PlayerService" 
         behaviorConfiguration="AjaxRestServiceBehavior">
...