Служба WCF работает локально, но выдает 404 на сервере - PullRequest
0 голосов
/ 28 мая 2020

Я видел несколько сообщений об этом, но не могу найти ответа.

[Отказ от ответственности: я мало знаю о WCF - хотя у меня есть доступ к код, это существующий проект, к которому я пытаюсь подключиться.]

Я создал клиент html / javascript для доступа к существующему API службы WCF. Каждое из них является отдельным приложением, поэтому, когда я запускаю локально, клиент и сервер работают на localhost, но с разными номерами портов. Это работает. Клиентское приложение может вызывать службу WCF с помощью вызова типа: https://localhost:4435/sessions.svc/getsession?sessionPK=3.

Когда я устанавливаю оба приложения на сервер (оба работают на одном сервере в качестве разных виртуальных приложений), служба действительно работает - я могу нажать https://myserver.com/api/sessions.svc из веб-браузера, и я получаю страницу вернулся из службы, сообщив мне, что она работает.

Однако теперь, когда клиент пытается получить доступ к службе так же, как это было локально (https://myserver.com/api/sessions.svc/getsession?sessionPK=3), я получаю ошибку 404 Not Found.

Клиент и служба WCF размещены на одном сервере с одним и тем же доменом root, поэтому CORS не должно быть проблемой.

Вот несколько фрагментов кода:

** Служба WCF **

[ServiceContract]
public interface ISessions
{
    [OperationContract]
    [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
    string GetSession(int? sessionPK);

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Sessions : BaseService, ISessions
    {
        public string GetSession(int sessionPK)
        {
          ...
        }
}

** Web.Config для службы **

<service behaviorConfiguration="BehaviorConfig" name="Sessions">
  <endpoint address="" binding="webHttpBinding" behaviorConfiguration="json"  contract="ISessions">
    <identity>
      <dns value="localhost"/>
    </identity>
  </endpoint>
  <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>

** Клиент **

export class DataService {

   constructor(private http : HttpClient){
     this.http.configure(config => {
      config.withBaseUrl("https://myserver.com/api/");
      config.withHeader("Accept", "application/json");
      config.withHeader("Content-Type", "application/json");
      config.withCredentials(true);
    })
  }

  public async getSessionById(id : number = 0){
    try{
       let result = this.http.get(`sessions.svc/getsession?sessionPK=${id}`);
       if(!result.isSuccess)
          throw response;

       ...
    }
    catch(error : any){
       ...
    }
}

Обновление

В ответ на запрос Питера я получаю тот же ответ от https://myserver.com/api/sessions.svc, что и от https://myserver.com/api/sessions.svc?wsdl. Это страница вроде этой:

enter image description here

Похоже, что служба не возвращает список операций, которые она предоставляет. Кстати, точно так же он работает на localhost.

Ответы [ 2 ]

0 голосов
/ 12 июня 2020

Оказывается, я запускал HTTP локально и HTTPS на сервере. Я решил свою проблему, добавив следующее:

 <webHttpBinding>
   <binding>
     <security mode="Transport"></security>
   </binding>
 </webHttpBinding>
0 голосов
/ 29 мая 2020

Если CORS не является проблемой, URI или формат вашей службы доступа могут быть неправильными. Вы можете открыть справочный документ в службе, чтобы узнать, как запросить интерфейс:

        <endpointBehaviors>
            <behavior name="ESEndPointBehavior">
                <webHttp helpEnabled="true"/>
            </behavior>
        </endpointBehaviors>

Access help документы:

enter image description here

Это дизайн интерфейса службы:

      [OperationContract]
    [WebGet(UriTemplate = "user/?name={name}",RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    Result GetUserData(string name);

Я не устанавливал стиль тела для WebMessageBodyStyle. Wrapped, потому что WebMessageBodyStyle.Wrapped Он в основном используется для инкапсуляции тела, но его нет в методе get. И при установке «WebMessageBodyStyle.Wrapped» документ справки не будет генерировать правильный формат запроса. Это будет примерно так:

enter image description here

Обычные справочные документы должны выглядеть следующим образом:

enter image description here

Он содержит URI и формат запроса.

...