Я видел несколько сообщений об этом, но не могу найти ответа.
[Отказ от ответственности: я мало знаю о 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
. Это страница вроде этой:
Похоже, что служба не возвращает список операций, которые она предоставляет. Кстати, точно так же он работает на localhost
.